<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>后端 on pearl blog</title>
    <link>https://pearlblog.pages.dev/tags/%E5%90%8E%E7%AB%AF/</link>
    <description>Recent content in 后端 on pearl blog</description>
    <generator>Hugo -- 0.147.7</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 04 Mar 2026 21:33:10 +0800</lastBuildDate>
    <atom:link href="https://pearlblog.pages.dev/tags/%E5%90%8E%E7%AB%AF/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>App后端开发</title>
      <link>https://pearlblog.pages.dev/posts/app%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/</link>
      <pubDate>Wed, 04 Mar 2026 21:33:10 +0800</pubDate>
      <guid>https://pearlblog.pages.dev/posts/app%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/</guid>
      <description>&lt;h1 id=&#34;什么是api&#34;&gt;什么是API？&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;前后端工作的一个完整的工作流，是前端发送HTTP请求，后端接受，完整请求任务（查找信息、调用ai等），并返回请求值。由于一个应用功能很多，故给后端上需要分而治之，即每个功能定义一个api，实现：
&lt;ul&gt;
&lt;li&gt;接收&lt;/li&gt;
&lt;li&gt;调用对应脚本（通常是许多函数，链接到对应脚本）&lt;/li&gt;
&lt;li&gt;返回&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;这个过程中，前端通过api定义的格式来发送请求到对应功能的api，并按照api定义的格式返回数据&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;如何搭建api&#34;&gt;如何搭建API？&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;自己从零开始写是不可能的，涉及许多HTTP等网络相关的繁琐工作，故需要&lt;strong&gt;API框架&lt;/strong&gt;。这些API框架帮你完成了诸如通信、交互等繁琐的任务，你只需要专注于功能的实现即可。&lt;/li&gt;
&lt;li&gt;常用的api框架有fastapi、flask、nodejs等，由于我对python比较熟悉，这里以fastapi为例。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;fastapi&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FastAPI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;app&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FastAPI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@app.get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;read_root&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;World&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@app.get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/items/&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{item_id}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;read_item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# 不在路径大括号里的参数，会被 FastAPI 自动识别为 Query Parameter（查询参数）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;item_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;q&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;以上是FASTAPI官方例程，这里做简单语法解释：&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;@app.get(&amp;quot;/&amp;quot;)&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@&lt;/code&gt;是python的装饰器，我将其理解为api的标志&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get&lt;/code&gt;：fastapi的方法，表示查看数据的&lt;strong&gt;动作&lt;/strong&gt;（不更改数据），除此之外还有&lt;code&gt;post&lt;/code&gt;（创建）、&lt;code&gt;put&lt;/code&gt;（修改）、&lt;code&gt;delect&lt;/code&gt;（删除）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;/&amp;quot;&lt;/code&gt;：路径。我觉得这是最抽象的一点。这个路径和你开发时app的目录结构没有任何关系，它代表的是你的&lt;strong&gt;功能模块&lt;/strong&gt;之间的结构和路径，表示你要对哪个功能进行操作。举个例子，我想实现一个集查询信息和论坛功能一体的应用：
&lt;img alt=&#34;example&#34; loading=&#34;lazy&#34; src=&#34;https://pearlblog.pages.dev/image/example.jpg&#34;&gt;&lt;/li&gt;
&lt;li&gt;有关竞赛的功能：放在competitions目录下；有关论坛的，放在forum目录下，功能结构非常清晰&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;总得来说，get等动作命令和路径化的功能信息明确指出了“要对哪个功能进行什么操作”。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;下面的就是通过不同函数的调用实现功能并返回值了。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;如何阅读api文档以fastapi为例&#34;&gt;如何阅读API文档？（以FASTAPI为例）&lt;/h1&gt;
&lt;h1 id=&#34;部署代码到服务器上&#34;&gt;部署代码到服务器上&lt;/h1&gt;
&lt;h2 id=&#34;推送到github&#34;&gt;推送到github&lt;/h2&gt;
&lt;h3 id=&#34;生成requirementstxt&#34;&gt;生成requirements.txt&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;pipreqs&lt;/code&gt;包，检测项目中用到的所有库和版本，并写入&lt;code&gt;requirements.txt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;pip install pipreqs
pipreqs . &amp;ndash;force&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.&lt;/code&gt;: 当前目录（终端打开的目录）下所有文件的依赖库&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--force&lt;/code&gt;: 强制覆盖，即使已存在requirements文件&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;内网穿透&#34;&gt;内网穿透&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;使用cpolar&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;0&#34;&gt;
&lt;li&gt;&lt;code&gt;uvicorn app.main:app --host 0.0.0.0 --port 8080&lt;/code&gt;开启你的后端&lt;/li&gt;
&lt;li&gt;下载、注册cpolar&lt;/li&gt;
&lt;li&gt;在“验证”中找到你的Authtoken&lt;/li&gt;
&lt;li&gt;在cmd上运行&lt;code&gt;cpolar authtoken &amp;lt;你的TOKEN内容&amp;gt;&lt;/code&gt;，将你的token添加到你的环境变量中&lt;/li&gt;
&lt;li&gt;cmd上&lt;code&gt;cpolar http 8080&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;输出一个http开头的随机域名，对应localhost。&lt;/li&gt;
&lt;li&gt;访问api：直接在该随机域名后添加api路径&lt;/li&gt;
&lt;li&gt;FASTAPI文档：直接在该随机域名后添加/docs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;免费模式，每次重启后端域名都会随机生成，下次开启后端后要重复步骤4，获取新域名。&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
  </channel>
</rss>
