mycpen-blog 0.0.0-fzaywwvdlm → 0.0.0-fzunuoumvr
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/css/index.css +1 -1
- package/js/custom.js +1 -1
- package/js/fcircle.js +1 -1
- package/js/fcircle_manage_panel.js +3 -3
- package/js/home_page_swiper.js +1 -1
- package/js/people.js +1 -1
- package/js/random.js +1 -1
- package/js/random_friends_post.js +1 -1
- package/js/tianli_gpt.js +1 -1
- package/json/friend.json +1 -1
- package/json/link.json +1 -1
- package/manifest.json +1 -1
- package/music1/main.css +1 -1
- package/music1/manifest.json +2 -2
- package/package.json +1 -1
- package/search.xml +6 -6
- package/sitemap.xml +88 -88
- package/wechatOA/main.css +1 -1
package/search.xml
CHANGED
|
@@ -485,7 +485,7 @@
|
|
|
485
485
|
<link href="/posts/3ffec809.html"/>
|
|
486
486
|
<url>/posts/3ffec809.html</url>
|
|
487
487
|
|
|
488
|
-
<content type="html"><![CDATA[<h2 id="2023-02-06-更新">2023/02/06 更新<a class="header-anchor" href="#2023-02-06-更新"></a></h2><p>VSCode 集成了 <code>某路径下的文件批量替换指定内容</code> 的功能,更方便</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202302061839251.png" alt="image-20230206183933193" style="zoom:50%;" /><h2 id="1-前言">1. 前言<a class="header-anchor" href="#1-前言"></a></h2><p>在 <a href="https://www.jsdelivr.com/">jsd</a> 失效之后,博主使用了新的图床方案,需将文章的原 jsd 图片链接替换为新的图片地址</p><p>这类脚本在网上有很多,都很推荐,如</p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容(Python版)</a></p></li><li class="lvl-2"><p><a href="https://blog.zhheo.com/p/369dbf41.html">张洪Heo:用 Python 批量替换 md 文件内容</a></p></li><li class="lvl-2"><p><a href="https://blog.justlovesmile.top/posts/7a5857a0.html">Justlovesmile:如何自动下载、压缩并批量替换文章中的外链图片</a></p></li></ul><h2 id="2-脚本内容">2. 脚本内容<a class="header-anchor" href="#2-脚本内容"></a></h2><p>源码来自:<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容(Python版)</a></p><p>脚本采用递归的方式,遍历 43~46 行 目录下的所有文件,进行批量替换</p><p>说明:</p><ol><li class="lvl-3"><p>根据自身情况修改 43~46 行 需遍历的目录;修改 47、48 行 需要替换的内容</p></li><li class="lvl-3"><p>脚本第 24 行 限制了只筛选出 Markdown 类型的文本文件进行修改,如需修改其他类型的文本文件 需自行更改后缀进行匹配</p></li><li class="lvl-3"><p>执行前请先备份源文件,以防出错后无法还原</p></li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 源码参考 https://blog.csdn.net/qq_38150250/article/details/118026219</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="comment"># 文件查找 find . -name file_name -type f</span></span><br><span class="line"><span class="comment"># 查找函数:search_path 查找根路径 </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取文章路径</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">search</span>(<span class="params">search_path, search_result</span>):</span><br><span class="line"> <span class="comment"># 获取当前路径下地所有文件</span></span><br><span class="line"> all_file = os.listdir(search_path)</span><br><span class="line"> <span class="comment"># 对于每一个文件</span></span><br><span class="line"> <span class="keyword">for</span> each_file <span class="keyword">in</span> all_file:</span><br><span class="line"> <span class="comment"># 若文件为一个文件夹</span></span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(search_path + each_file):</span><br><span class="line"> <span class="comment"># 递归查找</span></span><br><span class="line"> search(search_path + each_file + <span class="string">'/'</span>, search_result)</span><br><span class="line"> <span class="comment"># 如果是需要被查找的文件</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">if</span> re.findall(<span class="string">'.*\.md$'</span>, each_file) == [each_file]:</span><br><span class="line"> <span class="comment"># 输出路径</span></span><br><span class="line"> search_result.append(search_path + each_file)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 替换 sed -i 's/old_str/new_str/'</span></span><br><span class="line"><span class="comment"># 文本替换 replace_file_name 需要替换的文件路径,replace_old_str 要替换的字符,replace_new_str 替换的字符</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">replace</span>(<span class="params">replace_file_name, replace_old_str, replace_new_str</span>):</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">"r"</span>, encoding = <span class="string">"UTF-8"</span>) <span class="keyword">as</span> f1: </span><br><span class="line"> content = f1.read()</span><br><span class="line"> f1.close()</span><br><span class="line"> t = content.replace(replace_old_str, replace_new_str)</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">"w"</span>, encoding = <span class="string">"UTF-8"</span>) <span class="keyword">as</span> f2:</span><br><span class="line"> f2.write(t)</span><br><span class="line"> f2.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 需要改的地方</span></span><br><span class="line"><span class="comment">#path = 'E:/code_zone/.history/20220831_blog/source/_posts/'</span></span><br><span class="line">path_list = [</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source/source/_posts/'</span>,</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source-butterfly/source/_posts/'</span>,</span><br><span class="line">]</span><br><span class="line">old_str = <span class="string">'https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-
|
|
488
|
+
<content type="html"><![CDATA[<h2 id="2023-02-06-更新">2023/02/06 更新<a class="header-anchor" href="#2023-02-06-更新"></a></h2><p>VSCode 集成了 <code>某路径下的文件批量替换指定内容</code> 的功能,更方便</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202302061839251.png" alt="image-20230206183933193" style="zoom:50%;" /><h2 id="1-前言">1. 前言<a class="header-anchor" href="#1-前言"></a></h2><p>在 <a href="https://www.jsdelivr.com/">jsd</a> 失效之后,博主使用了新的图床方案,需将文章的原 jsd 图片链接替换为新的图片地址</p><p>这类脚本在网上有很多,都很推荐,如</p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容(Python版)</a></p></li><li class="lvl-2"><p><a href="https://blog.zhheo.com/p/369dbf41.html">张洪Heo:用 Python 批量替换 md 文件内容</a></p></li><li class="lvl-2"><p><a href="https://blog.justlovesmile.top/posts/7a5857a0.html">Justlovesmile:如何自动下载、压缩并批量替换文章中的外链图片</a></p></li></ul><h2 id="2-脚本内容">2. 脚本内容<a class="header-anchor" href="#2-脚本内容"></a></h2><p>源码来自:<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容(Python版)</a></p><p>脚本采用递归的方式,遍历 43~46 行 目录下的所有文件,进行批量替换</p><p>说明:</p><ol><li class="lvl-3"><p>根据自身情况修改 43~46 行 需遍历的目录;修改 47、48 行 需要替换的内容</p></li><li class="lvl-3"><p>脚本第 24 行 限制了只筛选出 Markdown 类型的文本文件进行修改,如需修改其他类型的文本文件 需自行更改后缀进行匹配</p></li><li class="lvl-3"><p>执行前请先备份源文件,以防出错后无法还原</p></li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 源码参考 https://blog.csdn.net/qq_38150250/article/details/118026219</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="comment"># 文件查找 find . -name file_name -type f</span></span><br><span class="line"><span class="comment"># 查找函数:search_path 查找根路径 </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取文章路径</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">search</span>(<span class="params">search_path, search_result</span>):</span><br><span class="line"> <span class="comment"># 获取当前路径下地所有文件</span></span><br><span class="line"> all_file = os.listdir(search_path)</span><br><span class="line"> <span class="comment"># 对于每一个文件</span></span><br><span class="line"> <span class="keyword">for</span> each_file <span class="keyword">in</span> all_file:</span><br><span class="line"> <span class="comment"># 若文件为一个文件夹</span></span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(search_path + each_file):</span><br><span class="line"> <span class="comment"># 递归查找</span></span><br><span class="line"> search(search_path + each_file + <span class="string">'/'</span>, search_result)</span><br><span class="line"> <span class="comment"># 如果是需要被查找的文件</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">if</span> re.findall(<span class="string">'.*\.md$'</span>, each_file) == [each_file]:</span><br><span class="line"> <span class="comment"># 输出路径</span></span><br><span class="line"> search_result.append(search_path + each_file)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 替换 sed -i 's/old_str/new_str/'</span></span><br><span class="line"><span class="comment"># 文本替换 replace_file_name 需要替换的文件路径,replace_old_str 要替换的字符,replace_new_str 替换的字符</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">replace</span>(<span class="params">replace_file_name, replace_old_str, replace_new_str</span>):</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">"r"</span>, encoding = <span class="string">"UTF-8"</span>) <span class="keyword">as</span> f1: </span><br><span class="line"> content = f1.read()</span><br><span class="line"> f1.close()</span><br><span class="line"> t = content.replace(replace_old_str, replace_new_str)</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">"w"</span>, encoding = <span class="string">"UTF-8"</span>) <span class="keyword">as</span> f2:</span><br><span class="line"> f2.write(t)</span><br><span class="line"> f2.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 需要改的地方</span></span><br><span class="line"><span class="comment">#path = 'E:/code_zone/.history/20220831_blog/source/_posts/'</span></span><br><span class="line">path_list = [</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source/source/_posts/'</span>,</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source-butterfly/source/_posts/'</span>,</span><br><span class="line">]</span><br><span class="line">old_str = <span class="string">'https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-fzanaoacgl/image/'</span></span><br><span class="line">new_str = <span class="string">'https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-fzanaoacgl/image/'</span></span><br><span class="line"></span><br><span class="line">search_result = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> result = [] <span class="comment"># 存放文件路径</span></span><br><span class="line"> <span class="comment"># 默认当前目录</span></span><br><span class="line"> <span class="comment"># path = os.getcwd()</span></span><br><span class="line"> <span class="keyword">for</span> path <span class="keyword">in</span> path_list:</span><br><span class="line"> search(path, result) <span class="comment"># 获取文章路径</span></span><br><span class="line"> count = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> file_name <span class="keyword">in</span> result:</span><br><span class="line"> replace(file_name, old_str, new_str)</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"{} done {}"</span>.<span class="built_in">format</span>(file_name, count))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># python E:/code_zone/tools/python-replace/replace.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="3-参考文章">3. 参考文章<a class="header-anchor" href="#3-参考文章"></a></h2><p>源码来自:<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容(Python版)</a></p>]]></content>
|
|
489
489
|
|
|
490
490
|
|
|
491
491
|
<categories>
|
|
@@ -543,7 +543,7 @@
|
|
|
543
543
|
<link href="/posts/583c5c34.html"/>
|
|
544
544
|
<url>/posts/583c5c34.html</url>
|
|
545
545
|
|
|
546
|
-
<content type="html"><![CDATA[<h2 id="前言">前言<a class="header-anchor" href="#前言"></a></h2><p>记录个人电脑环境</p><p>更新时间:2023.03.10</p><h2 id="Windows">Windows<a class="header-anchor" href="#Windows"></a></h2><h3 id="202303">202303<a class="header-anchor" href="#202303"></a></h3><p>系统重置记录</p><table><thead><tr><th colspan="3">软件</th></tr></thead><tbody><tr><td>联想电脑管家</td><td>联想应用商店</td><td>QQ</td></tr><tr><td>Clash for Windows</td><td>Typora</td><td>WeGame</td></tr><tr><td>Google Chrome</td><td>Microsoft Edge</td><td>Firefox</td></tr><tr><td>Logitech G HUB</td><td>搜狗输入法</td><td>网易邮箱大师</td></tr><tr><td>网易有道词典</td><td><a href="https://www.ghxi.com/ddqdpc.html">滴答清单</a></td><td>微信</td></tr><tr><td>腾讯会议</td><td>百度网盘</td><td>阿里云盘</td></tr><tr><td>哔哩哔哩</td><td>PotPlayer</td><td><a href="https://www.sublimetext.com/"><s>Sublime Text</s></a></td></tr><tr><td><a href="https://www.w3cschool.cn/sublimetext/sublimetext-mdc13bbj.html"><s>Sublime Text 汉化教程</s></a></td><td><a href="https://www.ghxi.com/sublimetext4.html">Sublime Text</a></td><td>WPS Office</td></tr><tr><td>腾讯文档</td><td>XMind ZEN(本地安装包)</td><td><a href="https://www.zjh336.cn/?id=280">XMind 8</a></td></tr><tr><td>WinRAR</td><td>Git</td><td>Windows Terminal</td></tr><tr><td><a href="https://www.bilibili.com/video/BV1n14y1x7Y7">WSL 2</a></td><td><a href="https://www.ghxi.com/vmware17.html">VMware Workstation Pro</a></td><td><a href="https://zhuanlan.zhihu.com/p/104118123">CentOS</a>、<a href="https://blog.cpen.top/posts/48860.html">安装教程</a></td></tr><tr><td>Xshell、Xftp</td><td>Visual Studio Code</td><td>SwitchHosts</td></tr><tr><td>PicGo、<a href="https://blog.csdn.net/jiangjianzhong00/article/details/128256073">教程</a>、<a href="https://github.com/mycpen/tools/tree/main/python-ftp">密钥</a></td><td>uTools</td><td>Snipaste</td></tr><tr><td>Python</td><td>PyCharm</td><td><a href="https://www.ghxi.com/navicat16.html">Navicat</a></td></tr><tr><td><a href="https://www.runoob.com/nodejs/nodejs-install-setup.html">Node.js</a></td><td><a href="https://iknow.lenovo.com.cn/detail/dc_178562.html">联想软件:关闭Win10系统自动更新</a></td><td><a href="https://iknow.lenovo.com.cn/detail/dc_184411_1.html"><s>联想软件:网络图标叹号修复工具</s></a></td></tr><tr><td><a href="https://github.com/listen1/listen1_desktop">Listen 1</a></td><td><a href="https://github.com/lyswhut/lx-music-desktop">LX Music</a></td><td><a href="https://desktop.telegram.org/">Telegram</a>、<a href="https://t.me/setlanguage/classic-zh-cn">汉化</a></td></tr><tr><td><a href="https://seer.61.com/">赛尔号</a></td><td><a href="https://github.com/Planshit/Tai">Tai</a></td><td rowspan="2"></td></tr><tr><td colspan="2"></td></tr></tbody></table><table><thead><tr><th colspan="3">GitHub</th></tr></thead><tbody><tr><td><a href="https://github.com/mycpen/image_bed">image_bed</a></td><td><a href="https://github.com/mycpen/ultra-tinypng">ultra-tinypng</a></td><td><a href="https://github.com/mycpen/tools">tools</a></td></tr><tr><td><a href="https://github.com/mycpen/hexo-source-butterfly">hexo-source-butterfly</a></td><td><a href="https://github.com/mycpen/hexo-source">hexo-source</a></td><td><a href="https://github.com/mycpen/hexo-source-diary">hexo-source-diary</a></td></tr><tr><td><a href="https://github.com/mycpen/nav">nav</a></td><td><a href="https://github.com/mycpen/dino">dino</a></td><td rowspan="3"></td></tr><tr><td rowspan="2" colspan="2"></td></tr><tr></tr></tbody></table><table><thead><tr><th colspan="3">VSCode</th></tr></thead><tbody><tr><td>简中插件</td><td>GitLens</td><td><a href="https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme">Material Icon Theme</a></td></tr><tr><td><a href="https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory">Git History</a></td><td
|
|
546
|
+
<content type="html"><![CDATA[<h2 id="前言">前言<a class="header-anchor" href="#前言"></a></h2><p>记录个人电脑环境</p><p>更新时间:2023.03.10</p><h2 id="Windows">Windows<a class="header-anchor" href="#Windows"></a></h2><h3 id="202303">202303<a class="header-anchor" href="#202303"></a></h3><p>系统重置记录</p><table><thead><tr><th colspan="3">软件</th></tr></thead><tbody><tr><td>联想电脑管家</td><td>联想应用商店</td><td>QQ</td></tr><tr><td>Clash for Windows</td><td>Typora</td><td>WeGame</td></tr><tr><td>Google Chrome</td><td>Microsoft Edge</td><td>Firefox</td></tr><tr><td>Logitech G HUB</td><td>搜狗输入法</td><td>网易邮箱大师</td></tr><tr><td>网易有道词典</td><td><a href="https://www.ghxi.com/ddqdpc.html">滴答清单</a></td><td>微信</td></tr><tr><td>腾讯会议</td><td>百度网盘</td><td>阿里云盘</td></tr><tr><td>哔哩哔哩</td><td>PotPlayer</td><td><a href="https://www.sublimetext.com/"><s>Sublime Text</s></a></td></tr><tr><td><a href="https://www.w3cschool.cn/sublimetext/sublimetext-mdc13bbj.html"><s>Sublime Text 汉化教程</s></a></td><td><a href="https://www.ghxi.com/sublimetext4.html">Sublime Text</a></td><td>WPS Office</td></tr><tr><td>腾讯文档</td><td>XMind ZEN(本地安装包)</td><td><a href="https://www.zjh336.cn/?id=280">XMind 8</a></td></tr><tr><td>WinRAR</td><td>Git</td><td>Windows Terminal</td></tr><tr><td><a href="https://www.bilibili.com/video/BV1n14y1x7Y7">WSL 2</a></td><td><a href="https://www.ghxi.com/vmware17.html">VMware Workstation Pro</a></td><td><a href="https://zhuanlan.zhihu.com/p/104118123">CentOS</a>、<a href="https://blog.cpen.top/posts/48860.html">安装教程</a></td></tr><tr><td>Xshell、Xftp</td><td>Visual Studio Code</td><td>SwitchHosts</td></tr><tr><td>PicGo、<a href="https://blog.csdn.net/jiangjianzhong00/article/details/128256073">教程</a>、<a href="https://github.com/mycpen/tools/tree/main/python-ftp">密钥</a></td><td>uTools</td><td>Snipaste</td></tr><tr><td>Python</td><td>PyCharm</td><td><a href="https://www.ghxi.com/navicat16.html">Navicat</a></td></tr><tr><td><a href="https://www.runoob.com/nodejs/nodejs-install-setup.html">Node.js</a></td><td><a href="https://iknow.lenovo.com.cn/detail/dc_178562.html">联想软件:关闭Win10系统自动更新</a></td><td><a href="https://iknow.lenovo.com.cn/detail/dc_184411_1.html"><s>联想软件:网络图标叹号修复工具</s></a></td></tr><tr><td><a href="https://github.com/listen1/listen1_desktop">Listen 1</a></td><td><a href="https://github.com/lyswhut/lx-music-desktop">LX Music</a></td><td><a href="https://desktop.telegram.org/">Telegram</a>、<a href="https://t.me/setlanguage/classic-zh-cn">汉化</a></td></tr><tr><td><a href="https://seer.61.com/">赛尔号</a></td><td><a href="https://github.com/Planshit/Tai">Tai</a></td><td rowspan="2"></td></tr><tr><td colspan="2"></td></tr></tbody></table><table><thead><tr><th colspan="3">GitHub</th></tr></thead><tbody><tr><td><a href="https://github.com/mycpen/image_bed">image_bed</a></td><td><a href="https://github.com/mycpen/ultra-tinypng">ultra-tinypng</a></td><td><a href="https://github.com/mycpen/tools">tools</a></td></tr><tr><td><a href="https://github.com/mycpen/hexo-source-butterfly">hexo-source-butterfly</a></td><td><a href="https://github.com/mycpen/hexo-source">hexo-source</a></td><td><a href="https://github.com/mycpen/hexo-source-diary">hexo-source-diary</a></td></tr><tr><td><a href="https://github.com/mycpen/nav">nav</a></td><td><a href="https://github.com/mycpen/dino">dino</a></td><td rowspan="3"></td></tr><tr><td rowspan="2" colspan="2"></td></tr><tr></tr></tbody></table><table><thead><tr><th colspan="3">VSCode</th></tr></thead><tbody><tr><td>简中插件</td><td>GitLens</td><td><a href="https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme">Material Icon Theme</a></td></tr><tr><td><a href="https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory">Git History</a></td><td><a href="https://wakatime.com/vs-code">WakaTime</a></td><td rowspan="2"></td></tr><tr><td colspan="2"></td></tr></tbody></table><table><thead><tr><th colspan="3">参考教程</th></tr></thead><tbody><tr><td><a href="https://blog.cpen.top/posts/583c5c34.html">本文</a></td><td><a href="https://mp.weixin.qq.com/s?__biz=MjM5MDA2MTI1MA==&mid=2649092080&idx=3&sn=124abf24a463486deaf380e710a31822&chksm=be5bc85d892c414b2f52e7d7d58a3a6dc987324ded0ed749295a480ce0cb86df1eaefd7fb3c7&scene=27">GIT SSH 密钥认证教程</a></td><td><a href="https://baijiahao.baidu.com/s?id=1742306839397588676">PyCharm 汉化</a></td></tr><tr><td><a href="https://www.ghxi.com/">果壳剥壳</a></td><td><a href="https://blog.csdn.net/qq_44498977/article/details/124204347">vscode 配置 gitbash 终端</a></td><td><a href="https://hexo.io/zh-cn/">Hexo 官网</a></td></tr><tr><td><a href="https://blog.anheyu.com/posts/sdxhu.html#npm-%E9%95%9C%E5%83%8F">npm 淘宝源</a></td><td><a href="https://juejin.cn/post/7078155627305893925">Typora 页面美化</a></td><td><a href="https://bearcai.com/index.php/archives/44/"><s>PicGo安装插件compress</s></a></td></tr><tr><td><a href="https://zhuanlan.zhihu.com/p/618663612">安装 Node.js</a></td><td rowspan="2" colspan="2"></td></tr><tr><td></td></tr></tbody></table><h3 id="202211">202211<a class="header-anchor" href="#202211"></a></h3><p>第三方分享网站:<a href="https://www.ghxi.com/">果壳剥壳</a></p><table><thead><tr><th>name</th><th>description</th></tr></thead><tbody><tr><td>联想电脑管家、联想应用商店、Legion Zone、Logitech G HUB、小米云服务、金山打字通、搜狗输入法、网易邮箱大师、网易有道词典、滴答清单</td><td rowspan="3"></td></tr><tr><td>腾讯QQ、微信、腾讯会议、向日葵</td></tr><tr><td>网易云音乐、酷我音乐、QQ音乐</td></tr><tr><td>百度网盘、阿里云盘、迅雷</td><td>网盘</td></tr><tr><td>哔哩、哔哩哔哩 UWP</td><td>哔哩哔哩uwp</td></tr><tr><td><a href="http://draw.io">draw.io</a></td><td>流程拓扑图</td></tr><tr><td>PotPlayer 64 bit</td><td>视频播放</td></tr><tr><td>Typora、Sublime Text、WPS Office、XMind 8、XMind 2021、腾讯文档、MarkdownPad 2</td><td>文本编辑</td></tr><tr><td>WSA Toolbox</td><td>WSA</td></tr><tr><td>Chrome、Firefox、Edge</td><td>浏览器</td></tr><tr><td>Windows Terminal、PowerShell 7、Git bash</td><td>终端</td></tr><tr><td>WSL2、Ubuntu 20.04 LTS、WSA</td><td rowspan="2">虚拟机</td></tr><tr><td>VMware Workstation Pro、Xshell 7、Xftp 7</td></tr><tr><td>Clash for Windows、Steam++</td><td>代理客户端</td></tr><tr><td>PyCharm、Visual Studio Code、HBuilder X、CodeBlocks、Visual C++ 6.0</td><td>开发工具</td></tr><tr><td>Postman</td><td>接口调试</td></tr><tr><td>SwitchHosts</td><td>本地解析</td></tr><tr><td>Navicat Premium 15、SQLyog、QuickRedis、Another Redis Desktop Manager</td><td>数据库客户端</td></tr><tr><td>PicGo</td><td>图片上传</td></tr><tr><td>uTools、Everything</td><td>剪贴板,取色</td></tr><tr><td>Snipaste</td><td>截图</td></tr><tr><td><a href="https://github.com/mycpen/ultra-tinypng">mycpen/ultra-tinypng</a></td><td>图片压缩。原地址:<a href="https://github.com/libudu/ultra-tinypng">libudu/ultra-tinypng</a></td></tr><tr><td><a href="https://github.com/mycpen/tools">mycpen/tools</a></td><td>私有仓库。ftp图床同步、内容替换</td></tr><tr></tr></tbody></table><h2 id="软件备份">软件备份<a class="header-anchor" href="#软件备份"></a></h2><ul class="lvl-0"><li class="lvl-2"><p>bilibili下载助手 (谷歌插件)</p><p>引导页:<a href="https://csser.top/">csser.top</a>、<a href="https://docs.qq.com/doc/DQ2lhaWRpS0tubVVF">docs.qq.com</a></p><p>crx文件备份 (v3.0.0):<a href="https://gitee.com/mycpen/cdn3/blob/master/download/bilibili-helper-3.0.0.crx">gitee.com/mycpen/cdn3</a></p></li></ul>]]></content>
|
|
547
547
|
|
|
548
548
|
|
|
549
549
|
<categories>
|
|
@@ -1041,7 +1041,7 @@
|
|
|
1041
1041
|
<link href="/posts/63259.html"/>
|
|
1042
1042
|
<url>/posts/63259.html</url>
|
|
1043
1043
|
|
|
1044
|
-
<content type="html"><![CDATA[<h2 id="一-前言">一. 前言<a class="header-anchor" href="#一-前言"></a></h2><p>因 <a href="https://www.jsdelivr.com/">https://www.jsdelivr.com/</a> 失效,博主打算将 GitHub 托管的图床备份到其他平台。</p><p>网上看到 <a href="https://github.com/lsky-org/lsky-pro">兰空图床</a> 萌生了自建图床的念头,搭建环境要求 PHP >= 8.0.2,于是打算编译安装 PHP。</p><p>最终因服务器配置太低(1核2G)编译失败而放弃。转而投身之前已经搭建好环境的又拍云平台。</p><p>博文内容:<code>PHP-CentOS8.2 编译安装 PHP8.1.10</code> + <code>编写GitHub图床迁移至又拍云的脚本(ftp)</code> + <code>编写批量修改文章内容的脚本</code></p><h2 id="二-正文">二. 正文<a class="header-anchor" href="#二-正文"></a></h2><h3 id="2-1❤-CentOS8-2-编译安装-PHP8-1-10">2.1❤ CentOS8.2 编译安装 PHP8.1.10<a class="header-anchor" href="#2-1❤-CentOS8-2-编译安装-PHP8-1-10"></a></h3><p><strong>2.1.1</strong> PHP8 和 oniguruma 源码下载并上传至服务器 /mnt 目录</p><p><a href="https://www.php.net/distributions/php-8.1.10.tar.gz">https://www.php.net/distributions/php-8.1.10.tar.gz</a></p><p><a href="https://codeload.github.com/kkos/oniguruma/tar.gz/refs/tags/v6.9.4">https://codeload.github.com/kkos/oniguruma/tar.gz/refs/tags/v6.9.4</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 解压</span></span><br><span class="line">tar xzf oniguruma-6.9.4.tar.gz</span><br><span class="line">tar xzf php-8.1.10.tar.gz</span><br></pre></td></tr></table></figure><p><strong>2.1.2</strong> 安装 PHP8 依赖包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 2 安装 PHP8 依赖包</span></span><br><span class="line">yum -y install autoconf freetype gd libpng libpng-devel libjpeg libxml2 libxml2-devel zlib curl curl-devel net-snmp-devel libjpeg-devel php-ldap openldap-devel openldap-clients freetype-devel gmp-devel libzip libzip-devel sqlite-devel automake libtool</span><br></pre></td></tr></table></figure><p><strong>2.1.3</strong> 编译 PHP8 依赖包 oniguruma</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 3.1 生成 configure</span></span><br><span class="line"><span class="built_in">cd</span> /mnt/oniguruma-6.9.4</span><br><span class="line">./autogen.sh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3.2 生成编译配置文件</span></span><br><span class="line">./configure --prefix=/usr</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3.3 编译并安装</span></span><br><span class="line">make && make install</span><br></pre></td></tr></table></figure><p><strong>2.1.4</strong> 编译 PHP8 主包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 4.1 生成编译配置文件</span></span><br><span class="line"><span class="built_in">cd</span> /mnt/php-8.1.10</span><br><span class="line">./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --enable-mysqlnd --with-mysqli --with-pdo-mysql --enable-opcache --with-pcre-jit --enable-gd --with-jpeg --with-freetype --with-gettext --with-curl --with-openssl --enable-sockets --enable-mbstring --enable-xml --with-zip --with-zlib --with-snmp --with-mhash --enable-ftp --enable-bcmath --enable-soap --enable-shmop --enable-sysvsem --enable-pcntl --with-gmp</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4.2 编译并安装</span></span><br><span class="line">make && make install</span><br></pre></td></tr></table></figure><p>因为配置过低,编译失败。</p><p><strong>2.1.5</strong> 编译安装后目录</p><p>/usr/local/php</p><p><strong>参考</strong></p><p><a href="https://www.bilibili.com/read/cv9248283/">https://www.bilibili.com/read/cv9248283/</a></p><p><a href="https://www.bilibili.com/video/BV13U4y1T7VS">https://www.bilibili.com/video/BV13U4y1T7VS</a></p><h3 id="2-2-基于-FTP-将GitHub图床迁移至又拍云">2.2 基于 FTP 将GitHub图床迁移至又拍云<a class="header-anchor" href="#2-2-基于-FTP-将GitHub图床迁移至又拍云"></a></h3><p><strong>参考</strong></p><p><a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">官方视频教程 - 创建存储服务和使用 FTP 上传</a>可以得到用户名和密码</p><p>默认已经完成了又拍云云存储服务的申请 + 绑定自定义域名 <a href="https://help.upyun.com/knowledge-base/quick_start/">https://help.upyun.com/knowledge-base/quick_start/</a></p><p><strong>2.2.1</strong> 编写 Python 脚本 实现批量</p><p>源码来自<a href="http://blog.csdn.net/ouyang_peng/article/details/79271113">http://blog.csdn.net/ouyang_peng/article/details/79271113</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> cmath <span class="keyword">import</span> log</span><br><span class="line"><span class="keyword">from</span> ftplib <span class="keyword">import</span> FTP</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyFTP</span>:</span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> ftp自动下载、自动上传脚本,可以递归目录操作</span></span><br><span class="line"><span class="string"> 作者:欧阳鹏</span></span><br><span class="line"><span class="string"> 博客地址:http://blog.csdn.net/ouyang_peng/article/details/79271113</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, host, port=<span class="number">21</span></span>):</span><br><span class="line"> <span class="string">""" 初始化 FTP 客户端</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> host:ip地址</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> port:端口号</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="comment"># print("__init__()---> host = %s ,port = %s" % (host, port))</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.host = host</span><br><span class="line"> <span class="variable language_">self</span>.port = port</span><br><span class="line"> <span class="variable language_">self</span>.ftp = FTP()</span><br><span class="line"> <span class="comment"># 重新设置下编码方式</span></span><br><span class="line"> <span class="comment">#self.ftp.encoding = 'gbk'</span></span><br><span class="line"> <span class="variable language_">self</span>.ftp.encoding = <span class="string">'utf8'</span></span><br><span class="line"> <span class="comment"># 获取脚本路径</span></span><br><span class="line"> path = os.path.dirname(os.path.realpath(__file__))</span><br><span class="line"> <span class="variable language_">self</span>.log_file = <span class="built_in">open</span>(path + <span class="string">"/log.txt"</span>, <span class="string">"a"</span>, encoding=<span class="string">'utf-8'</span>)</span><br><span class="line"> <span class="variable language_">self</span>.file_list = []</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">login</span>(<span class="params">self, username, password</span>):</span><br><span class="line"> <span class="string">""" 初始化 FTP 客户端</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> username: 用户名</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> password: 密码</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> timeout = <span class="number">60</span></span><br><span class="line"> socket.setdefaulttimeout(timeout)</span><br><span class="line"> <span class="comment"># 0主动模式 1 #被动模式</span></span><br><span class="line"> <span class="variable language_">self</span>.ftp.set_pasv(<span class="literal">True</span>)</span><br><span class="line"> <span class="comment"># 打开调试级别2,显示详细信息</span></span><br><span class="line"> <span class="comment"># self.ftp.set_debuglevel(2)</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'开始尝试连接到 %s'</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.connect(<span class="variable language_">self</span>.host, <span class="variable language_">self</span>.port)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'成功连接到 %s'</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'开始尝试登录到 %s'</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.login(username, password)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'成功登录到 %s'</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="variable language_">self</span>.ftp.welcome)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.deal_error(<span class="string">"FTP 连接或登录失败 ,错误描述为:%s"</span> % err)</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">is_same_size</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line"> <span class="string">"""判断远程文件和本地文件大小是否一致</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_file: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_file: 远程文件</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> remote_file_size = <span class="variable language_">self</span>.ftp.size(remote_file)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="comment"># self.debug_print("is_same_size() 错误描述为:%s" % err)</span></span><br><span class="line"> remote_file_size = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> local_file_size = os.path.getsize(local_file)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="comment"># self.debug_print("is_same_size() 错误描述为:%s" % err)</span></span><br><span class="line"> local_file_size = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'local_file_size:%d , remote_file_size:%d'</span> % (local_file_size, remote_file_size))</span><br><span class="line"> <span class="keyword">if</span> remote_file_size == local_file_size:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">download_file</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line"> <span class="string">"""从ftp下载文件</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_file: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_file: 远程文件</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"download_file()---> local_path = %s ,remote_path = %s"</span> % (local_file, remote_file))</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="variable language_">self</span>.is_same_size(local_file, remote_file):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'%s 文件大小相同,无需下载'</span> % local_file)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'>>>>>>>>>>>>下载文件 %s ... ...'</span> % local_file)</span><br><span class="line"> buf_size = <span class="number">1024</span></span><br><span class="line"> file_handler = <span class="built_in">open</span>(local_file, <span class="string">'wb'</span>)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.retrbinary(<span class="string">'RETR %s'</span> % remote_file, file_handler.write, buf_size)</span><br><span class="line"> file_handler.close()</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'下载文件出错,出现异常:%s '</span> % err)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">download_file_tree</span>(<span class="params">self, local_path, remote_path</span>):</span><br><span class="line"> <span class="string">"""从远程目录下载多个文件到本地目录</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_path: 本地路径</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_path: 远程路径</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"download_file_tree()---> local_path = %s ,remote_path = %s"</span> % (local_path, remote_path))</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(remote_path)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'远程目录%s不存在,继续...'</span> % remote_path + <span class="string">" ,具体错误描述为:%s"</span> % err)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.isdir(local_path):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'本地目录%s不存在,先创建本地目录'</span> % local_path)</span><br><span class="line"> os.makedirs(local_path)</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'切换至目录: %s'</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.file_list = []</span><br><span class="line"> <span class="comment"># 方法回调</span></span><br><span class="line"> <span class="variable language_">self</span>.ftp.<span class="built_in">dir</span>(<span class="variable language_">self</span>.get_file_list)</span><br><span class="line"></span><br><span class="line"> remote_names = <span class="variable language_">self</span>.file_list</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'远程目录 列表: %s'</span> % remote_names)</span><br><span class="line"> <span class="keyword">for</span> item <span class="keyword">in</span> remote_names:</span><br><span class="line"> file_type = item[<span class="number">0</span>]</span><br><span class="line"> file_name = item[<span class="number">1</span>]</span><br><span class="line"> local = os.path.join(local_path, file_name)</span><br><span class="line"> <span class="keyword">if</span> file_type == <span class="string">'d'</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"download_file_tree()---> 下载目录: %s"</span> % file_name)</span><br><span class="line"> <span class="variable language_">self</span>.download_file_tree(local, file_name)</span><br><span class="line"> <span class="keyword">elif</span> file_type == <span class="string">'-'</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"download_file()---> 下载文件: %s"</span> % file_name)</span><br><span class="line"> <span class="variable language_">self</span>.download_file(local, file_name)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(<span class="string">".."</span>)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'返回上层目录 %s'</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">upload_file</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line"> <span class="string">"""从本地上传文件到ftp</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_path: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_path: 远程文件</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.isfile(local_file):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'%s 不存在'</span> % local_file)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="variable language_">self</span>.is_same_size(local_file, remote_file):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'跳过相等的文件: %s'</span> % local_file)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> buf_size = <span class="number">1024</span></span><br><span class="line"> file_handler = <span class="built_in">open</span>(local_file, <span class="string">'rb'</span>)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.storbinary(<span class="string">'STOR %s'</span> % remote_file, file_handler, buf_size)</span><br><span class="line"> file_handler.close()</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'上传: %s'</span> % local_file + <span class="string">"成功!"</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">upload_file_tree</span>(<span class="params">self, local_path, remote_path</span>):</span><br><span class="line"> <span class="string">"""从本地上传目录下多个文件到ftp</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> local_path: 本地路径</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_path: 远程路径</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.isdir(local_path):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'本地目录 %s 不存在'</span> % local_path)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(remote_path)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'切换至远程目录: %s'</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"></span><br><span class="line"> local_name_list = os.listdir(local_path)</span><br><span class="line"> <span class="keyword">for</span> local_name <span class="keyword">in</span> local_name_list:</span><br><span class="line"> src = os.path.join(local_path, local_name)</span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(src):</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="variable language_">self</span>.ftp.mkd(local_name)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"目录已存在 %s ,具体错误描述为:%s"</span> % (local_name, err))</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"upload_file_tree()---> 上传目录: %s"</span> % local_name)</span><br><span class="line"> <span class="variable language_">self</span>.upload_file_tree(src, local_name)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"upload_file_tree()---> 上传文件: %s"</span> % local_name)</span><br><span class="line"> <span class="variable language_">self</span>.upload_file(src, local_name)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(<span class="string">".."</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">close</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="string">""" 退出ftp</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"close()---> FTP退出"</span>)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.quit()</span><br><span class="line"> <span class="variable language_">self</span>.log_file.close()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">debug_print</span>(<span class="params">self, s</span>):</span><br><span class="line"> <span class="string">""" 打印日志</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="variable language_">self</span>.write_log(s)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">deal_error</span>(<span class="params">self, e</span>):</span><br><span class="line"> <span class="string">""" 处理错误异常</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> e:异常</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> log_str = <span class="string">'发生错误: %s'</span> % e</span><br><span class="line"> <span class="variable language_">self</span>.write_log(log_str)</span><br><span class="line"> sys.exit()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">write_log</span>(<span class="params">self, log_str</span>):</span><br><span class="line"> <span class="string">""" 记录日志</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> log_str:日志</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> time_now = time.localtime()</span><br><span class="line"> date_now = time.strftime(<span class="string">'%Y-%m-%d'</span>, time_now)</span><br><span class="line"> format_log_str = <span class="string">"%s ---> %s \n "</span> % (date_now, log_str)</span><br><span class="line"> <span class="built_in">print</span>(format_log_str)</span><br><span class="line"> <span class="variable language_">self</span>.log_file.write(format_log_str)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_file_list</span>(<span class="params">self, line</span>):</span><br><span class="line"> <span class="string">""" 获取文件列表</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> line:</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> file_arr = <span class="variable language_">self</span>.get_file_name(line)</span><br><span class="line"> <span class="comment"># 去除 . 和 ..</span></span><br><span class="line"> <span class="keyword">if</span> file_arr[<span class="number">1</span>] <span class="keyword">not</span> <span class="keyword">in</span> [<span class="string">'.'</span>, <span class="string">'..'</span>]:</span><br><span class="line"> <span class="variable language_">self</span>.file_list.append(file_arr)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_file_name</span>(<span class="params">self, line</span>):</span><br><span class="line"> <span class="string">""" 获取文件名</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> line:</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> pos = line.rfind(<span class="string">':'</span>)</span><br><span class="line"> <span class="keyword">while</span> (line[pos] != <span class="string">' '</span>):</span><br><span class="line"> pos += <span class="number">1</span></span><br><span class="line"> <span class="keyword">while</span> (line[pos] == <span class="string">' '</span>):</span><br><span class="line"> pos += <span class="number">1</span></span><br><span class="line"> file_arr = [line[<span class="number">0</span>], line[pos:]]</span><br><span class="line"> <span class="keyword">return</span> file_arr</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</span><br><span class="line"> <span class="comment"># 清除日志</span></span><br><span class="line"> path = os.path.dirname(os.path.realpath(__file__)) <span class="comment"># 脚本路径</span></span><br><span class="line"> <span class="keyword">if</span> os.path.exists(path + <span class="string">'/log.txt'</span>):</span><br><span class="line"> log_file = path + <span class="string">'/log.txt '</span><span class="keyword">if</span> os.sep == <span class="string">"/"</span> <span class="keyword">else</span> path + <span class="string">'\\'</span> + <span class="string">'log.txt'</span></span><br><span class="line"> subprocess.Popen(<span class="string">f'rm -rf <span class="subst">{log_file}</span>'</span>, shell=<span class="literal">True</span>)</span><br><span class="line"> time.sleep(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"> my_ftp = MyFTP(<span class="string">"xxx.ftp.upyun.com"</span>)</span><br><span class="line"> my_ftp.login(<span class="string">"xxx/xxx"</span>, <span class="string">"xxx"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 下载单个文件</span></span><br><span class="line"> <span class="comment"># my_ftp.download_file("E:/code_zone/image_bed/image/wallpaper/1.jpg", "/image/wallpaper/1.jpg")</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 上传单个文件</span></span><br><span class="line"> <span class="comment"># my_ftp.upload_file("G:/ftp_test/Release/XTCLauncher.apk", "/App/AutoUpload/ouyangpeng/I12/Release/XTCLauncher.apk")</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 下载目录</span></span><br><span class="line"> <span class="comment"># image.cpen.top/image/ → 本地 E:/code_zone/image_bed/image/ (本地图床目录, 又拍云路径)</span></span><br><span class="line"> <span class="keyword">if</span> os.sep == <span class="string">"\\"</span>:</span><br><span class="line"> my_ftp.download_file_tree(<span class="string">"E:/code_zone/image_bed/image/"</span>, <span class="string">"/image/"</span>)</span><br><span class="line"> <span class="keyword">elif</span> os.sep == <span class="string">"/"</span>: <span class="comment"># aliyun</span></span><br><span class="line"> my_ftp.download_file_tree(<span class="string">"/root/code_zone/image_bed/image/"</span>, <span class="string">"/image/"</span>)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 上传目录</span></span><br><span class="line"> <span class="comment"># 本地 E:/code_zone/image_bed/image/ → image.cpen.top/image/ (本地图床目录, 又拍云路径)</span></span><br><span class="line"> <span class="keyword">if</span> os.sep == <span class="string">"\\"</span>: <span class="comment"># Windows</span></span><br><span class="line"> my_ftp.upload_file_tree(<span class="string">"E:/code_zone/image_bed/image/"</span>, <span class="string">"/image/"</span>) </span><br><span class="line"> my_ftp.close()</span><br><span class="line"> <span class="keyword">elif</span> os.sep == <span class="string">"/"</span>: <span class="comment"># aliyun</span></span><br><span class="line"> my_ftp.upload_file_tree(<span class="string">"/root/code_zone/image_bed/image/"</span>, <span class="string">"/image/"</span>) </span><br><span class="line"> my_ftp.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># python E:/code_zone/tools/python-ftp/ftp.py</span></span><br><span class="line"><span class="comment"># python3 /root/code_zone/tools/python-ftp/ftp.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>2.2.2</strong> 说明</p><p><code>my_ftp.login("用户名xxx/xxx", "密码xxx")</code> 参考 <a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">https://techs.upyun.com/videos/cdnpage/creating_storage.html</a></p><p>后期又将脚本传到云服务器上,通过计划任务,每15分钟同步,保持 GitHub 与又拍云图床一致</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># root @ CentOS in ~ [18:05:59]</span></span><br><span class="line">$ crontab -l</span><br><span class="line">*/15 * * * * <span class="built_in">cd</span> /root/code_zone/image_bed/; git pull; python3 /root/code_zone/tools/python-ftp/ftp.py; bash git.sh</span><br></pre></td></tr></table></figure><p>迁移好图床后,博客中调用图片资源时 浏览器自动 http 跳 https,因为没有证书导致图片失效,于是又申请了 ssl 证书,上传至又拍云。</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220910180219146.png" alt=""></p></blockquote><h3 id="2-3-编写批量修改文章内容的脚本">2.3 编写批量修改文章内容的脚本<a class="header-anchor" href="#2-3-编写批量修改文章内容的脚本"></a></h3><p>源码参考<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">https://blog.csdn.net/qq_38150250/article/details/118026219</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 源码参考 https://blog.csdn.net/qq_38150250/article/details/118026219</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="comment"># 文件查找 find . -name file_name -type f</span></span><br><span class="line"><span class="comment"># 查找函数:search_path 查找根路径 </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取文章路径</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">search</span>(<span class="params">search_path, search_result</span>):</span><br><span class="line"> <span class="comment"># 获取当前路径下地所有文件</span></span><br><span class="line"> all_file = os.listdir(search_path)</span><br><span class="line"> <span class="comment"># 对于每一个文件</span></span><br><span class="line"> <span class="keyword">for</span> each_file <span class="keyword">in</span> all_file:</span><br><span class="line"> <span class="comment"># 若文件为一个文件夹</span></span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(search_path + each_file):</span><br><span class="line"> <span class="comment"># 递归查找</span></span><br><span class="line"> search(search_path + each_file + <span class="string">'/'</span>, search_result)</span><br><span class="line"> <span class="comment"># 如果是需要被查找的文件</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">if</span> re.findall(<span class="string">'.*\.md$'</span>, each_file) == [each_file]:</span><br><span class="line"> <span class="comment"># 输出路径</span></span><br><span class="line"> search_result.append(search_path + each_file)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 替换 sed -i 's/old_str/new_str/'</span></span><br><span class="line"><span class="comment"># 文本替换 replace_file_name 需要替换的文件路径,replace_old_str 要替换的字符,replace_new_str 替换的字符</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">replace</span>(<span class="params">replace_file_name, replace_old_str, replace_new_str</span>):</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">"r"</span>, encoding = <span class="string">"UTF-8"</span>) <span class="keyword">as</span> f1: </span><br><span class="line"> content = f1.read()</span><br><span class="line"> f1.close()</span><br><span class="line"> t = content.replace(replace_old_str, replace_new_str)</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">"w"</span>, encoding = <span class="string">"UTF-8"</span>) <span class="keyword">as</span> f2:</span><br><span class="line"> f2.write(t)</span><br><span class="line"> f2.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 需要改的地方</span></span><br><span class="line"><span class="comment">#path = 'E:/code_zone/.history/20220831_blog/source/_posts/'</span></span><br><span class="line">path_list = [</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source/source/_posts/'</span>,</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source-butterfly/source/_posts/'</span>,</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source-diary/source/_posts/'</span>,</span><br><span class="line">]</span><br><span class="line">old_str = <span class="string">'https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-fzuycsadwt/image/'</span></span><br><span class="line">new_str = <span class="string">'https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-fzuycsadwt/image/'</span></span><br><span class="line">search_result = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> result = [] <span class="comment"># 存放文件路径</span></span><br><span class="line"> <span class="comment"># 默认当前目录</span></span><br><span class="line"> <span class="comment"># path = os.getcwd()</span></span><br><span class="line"> <span class="keyword">for</span> path <span class="keyword">in</span> path_list:</span><br><span class="line"> search(path, result) <span class="comment"># 获取文章路径</span></span><br><span class="line"> count = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> file_name <span class="keyword">in</span> result:</span><br><span class="line"> replace(file_name, old_str, new_str)</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"{} done {}"</span>.<span class="built_in">format</span>(file_name, count))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># python E:/code_zone/tools/python-replace/replace.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>2.3.1</strong> 说明</p><p><code>search</code>函数指定文件类型为 .md,可获得文章的完整路径;</p><p><code>path_list</code>列表存放需要修改的文章父目录路径,可以递归查询子目录;</p><p><code>old_str</code>需要替换的内容</p><p><code>new_str</code>新内容</p>]]></content>
|
|
1044
|
+
<content type="html"><![CDATA[<h2 id="一-前言">一. 前言<a class="header-anchor" href="#一-前言"></a></h2><p>因 <a href="https://www.jsdelivr.com/">https://www.jsdelivr.com/</a> 失效,博主打算将 GitHub 托管的图床备份到其他平台。</p><p>网上看到 <a href="https://github.com/lsky-org/lsky-pro">兰空图床</a> 萌生了自建图床的念头,搭建环境要求 PHP >= 8.0.2,于是打算编译安装 PHP。</p><p>最终因服务器配置太低(1核2G)编译失败而放弃。转而投身之前已经搭建好环境的又拍云平台。</p><p>博文内容:<code>PHP-CentOS8.2 编译安装 PHP8.1.10</code> + <code>编写GitHub图床迁移至又拍云的脚本(ftp)</code> + <code>编写批量修改文章内容的脚本</code></p><h2 id="二-正文">二. 正文<a class="header-anchor" href="#二-正文"></a></h2><h3 id="2-1❤-CentOS8-2-编译安装-PHP8-1-10">2.1❤ CentOS8.2 编译安装 PHP8.1.10<a class="header-anchor" href="#2-1❤-CentOS8-2-编译安装-PHP8-1-10"></a></h3><p><strong>2.1.1</strong> PHP8 和 oniguruma 源码下载并上传至服务器 /mnt 目录</p><p><a href="https://www.php.net/distributions/php-8.1.10.tar.gz">https://www.php.net/distributions/php-8.1.10.tar.gz</a></p><p><a href="https://codeload.github.com/kkos/oniguruma/tar.gz/refs/tags/v6.9.4">https://codeload.github.com/kkos/oniguruma/tar.gz/refs/tags/v6.9.4</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 解压</span></span><br><span class="line">tar xzf oniguruma-6.9.4.tar.gz</span><br><span class="line">tar xzf php-8.1.10.tar.gz</span><br></pre></td></tr></table></figure><p><strong>2.1.2</strong> 安装 PHP8 依赖包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 2 安装 PHP8 依赖包</span></span><br><span class="line">yum -y install autoconf freetype gd libpng libpng-devel libjpeg libxml2 libxml2-devel zlib curl curl-devel net-snmp-devel libjpeg-devel php-ldap openldap-devel openldap-clients freetype-devel gmp-devel libzip libzip-devel sqlite-devel automake libtool</span><br></pre></td></tr></table></figure><p><strong>2.1.3</strong> 编译 PHP8 依赖包 oniguruma</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 3.1 生成 configure</span></span><br><span class="line"><span class="built_in">cd</span> /mnt/oniguruma-6.9.4</span><br><span class="line">./autogen.sh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3.2 生成编译配置文件</span></span><br><span class="line">./configure --prefix=/usr</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3.3 编译并安装</span></span><br><span class="line">make && make install</span><br></pre></td></tr></table></figure><p><strong>2.1.4</strong> 编译 PHP8 主包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 4.1 生成编译配置文件</span></span><br><span class="line"><span class="built_in">cd</span> /mnt/php-8.1.10</span><br><span class="line">./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --enable-mysqlnd --with-mysqli --with-pdo-mysql --enable-opcache --with-pcre-jit --enable-gd --with-jpeg --with-freetype --with-gettext --with-curl --with-openssl --enable-sockets --enable-mbstring --enable-xml --with-zip --with-zlib --with-snmp --with-mhash --enable-ftp --enable-bcmath --enable-soap --enable-shmop --enable-sysvsem --enable-pcntl --with-gmp</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4.2 编译并安装</span></span><br><span class="line">make && make install</span><br></pre></td></tr></table></figure><p>因为配置过低,编译失败。</p><p><strong>2.1.5</strong> 编译安装后目录</p><p>/usr/local/php</p><p><strong>参考</strong></p><p><a href="https://www.bilibili.com/read/cv9248283/">https://www.bilibili.com/read/cv9248283/</a></p><p><a href="https://www.bilibili.com/video/BV13U4y1T7VS">https://www.bilibili.com/video/BV13U4y1T7VS</a></p><h3 id="2-2-基于-FTP-将GitHub图床迁移至又拍云">2.2 基于 FTP 将GitHub图床迁移至又拍云<a class="header-anchor" href="#2-2-基于-FTP-将GitHub图床迁移至又拍云"></a></h3><p><strong>参考</strong></p><p><a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">官方视频教程 - 创建存储服务和使用 FTP 上传</a>可以得到用户名和密码</p><p>默认已经完成了又拍云云存储服务的申请 + 绑定自定义域名 <a href="https://help.upyun.com/knowledge-base/quick_start/">https://help.upyun.com/knowledge-base/quick_start/</a></p><p><strong>2.2.1</strong> 编写 Python 脚本 实现批量</p><p>源码来自<a href="http://blog.csdn.net/ouyang_peng/article/details/79271113">http://blog.csdn.net/ouyang_peng/article/details/79271113</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> cmath <span class="keyword">import</span> log</span><br><span class="line"><span class="keyword">from</span> ftplib <span class="keyword">import</span> FTP</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyFTP</span>:</span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> ftp自动下载、自动上传脚本,可以递归目录操作</span></span><br><span class="line"><span class="string"> 作者:欧阳鹏</span></span><br><span class="line"><span class="string"> 博客地址:http://blog.csdn.net/ouyang_peng/article/details/79271113</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, host, port=<span class="number">21</span></span>):</span><br><span class="line"> <span class="string">""" 初始化 FTP 客户端</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> host:ip地址</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> port:端口号</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="comment"># print("__init__()---> host = %s ,port = %s" % (host, port))</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.host = host</span><br><span class="line"> <span class="variable language_">self</span>.port = port</span><br><span class="line"> <span class="variable language_">self</span>.ftp = FTP()</span><br><span class="line"> <span class="comment"># 重新设置下编码方式</span></span><br><span class="line"> <span class="comment">#self.ftp.encoding = 'gbk'</span></span><br><span class="line"> <span class="variable language_">self</span>.ftp.encoding = <span class="string">'utf8'</span></span><br><span class="line"> <span class="comment"># 获取脚本路径</span></span><br><span class="line"> path = os.path.dirname(os.path.realpath(__file__))</span><br><span class="line"> <span class="variable language_">self</span>.log_file = <span class="built_in">open</span>(path + <span class="string">"/log.txt"</span>, <span class="string">"a"</span>, encoding=<span class="string">'utf-8'</span>)</span><br><span class="line"> <span class="variable language_">self</span>.file_list = []</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">login</span>(<span class="params">self, username, password</span>):</span><br><span class="line"> <span class="string">""" 初始化 FTP 客户端</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> username: 用户名</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> password: 密码</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> timeout = <span class="number">60</span></span><br><span class="line"> socket.setdefaulttimeout(timeout)</span><br><span class="line"> <span class="comment"># 0主动模式 1 #被动模式</span></span><br><span class="line"> <span class="variable language_">self</span>.ftp.set_pasv(<span class="literal">True</span>)</span><br><span class="line"> <span class="comment"># 打开调试级别2,显示详细信息</span></span><br><span class="line"> <span class="comment"># self.ftp.set_debuglevel(2)</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'开始尝试连接到 %s'</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.connect(<span class="variable language_">self</span>.host, <span class="variable language_">self</span>.port)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'成功连接到 %s'</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'开始尝试登录到 %s'</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.login(username, password)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'成功登录到 %s'</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="variable language_">self</span>.ftp.welcome)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.deal_error(<span class="string">"FTP 连接或登录失败 ,错误描述为:%s"</span> % err)</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">is_same_size</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line"> <span class="string">"""判断远程文件和本地文件大小是否一致</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_file: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_file: 远程文件</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> remote_file_size = <span class="variable language_">self</span>.ftp.size(remote_file)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="comment"># self.debug_print("is_same_size() 错误描述为:%s" % err)</span></span><br><span class="line"> remote_file_size = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> local_file_size = os.path.getsize(local_file)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="comment"># self.debug_print("is_same_size() 错误描述为:%s" % err)</span></span><br><span class="line"> local_file_size = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'local_file_size:%d , remote_file_size:%d'</span> % (local_file_size, remote_file_size))</span><br><span class="line"> <span class="keyword">if</span> remote_file_size == local_file_size:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">download_file</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line"> <span class="string">"""从ftp下载文件</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_file: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_file: 远程文件</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"download_file()---> local_path = %s ,remote_path = %s"</span> % (local_file, remote_file))</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="variable language_">self</span>.is_same_size(local_file, remote_file):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'%s 文件大小相同,无需下载'</span> % local_file)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'>>>>>>>>>>>>下载文件 %s ... ...'</span> % local_file)</span><br><span class="line"> buf_size = <span class="number">1024</span></span><br><span class="line"> file_handler = <span class="built_in">open</span>(local_file, <span class="string">'wb'</span>)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.retrbinary(<span class="string">'RETR %s'</span> % remote_file, file_handler.write, buf_size)</span><br><span class="line"> file_handler.close()</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'下载文件出错,出现异常:%s '</span> % err)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">download_file_tree</span>(<span class="params">self, local_path, remote_path</span>):</span><br><span class="line"> <span class="string">"""从远程目录下载多个文件到本地目录</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_path: 本地路径</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_path: 远程路径</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"download_file_tree()---> local_path = %s ,remote_path = %s"</span> % (local_path, remote_path))</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(remote_path)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'远程目录%s不存在,继续...'</span> % remote_path + <span class="string">" ,具体错误描述为:%s"</span> % err)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.isdir(local_path):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'本地目录%s不存在,先创建本地目录'</span> % local_path)</span><br><span class="line"> os.makedirs(local_path)</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'切换至目录: %s'</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.file_list = []</span><br><span class="line"> <span class="comment"># 方法回调</span></span><br><span class="line"> <span class="variable language_">self</span>.ftp.<span class="built_in">dir</span>(<span class="variable language_">self</span>.get_file_list)</span><br><span class="line"></span><br><span class="line"> remote_names = <span class="variable language_">self</span>.file_list</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'远程目录 列表: %s'</span> % remote_names)</span><br><span class="line"> <span class="keyword">for</span> item <span class="keyword">in</span> remote_names:</span><br><span class="line"> file_type = item[<span class="number">0</span>]</span><br><span class="line"> file_name = item[<span class="number">1</span>]</span><br><span class="line"> local = os.path.join(local_path, file_name)</span><br><span class="line"> <span class="keyword">if</span> file_type == <span class="string">'d'</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"download_file_tree()---> 下载目录: %s"</span> % file_name)</span><br><span class="line"> <span class="variable language_">self</span>.download_file_tree(local, file_name)</span><br><span class="line"> <span class="keyword">elif</span> file_type == <span class="string">'-'</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"download_file()---> 下载文件: %s"</span> % file_name)</span><br><span class="line"> <span class="variable language_">self</span>.download_file(local, file_name)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(<span class="string">".."</span>)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'返回上层目录 %s'</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">upload_file</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line"> <span class="string">"""从本地上传文件到ftp</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_path: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_path: 远程文件</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.isfile(local_file):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'%s 不存在'</span> % local_file)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="variable language_">self</span>.is_same_size(local_file, remote_file):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'跳过相等的文件: %s'</span> % local_file)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> buf_size = <span class="number">1024</span></span><br><span class="line"> file_handler = <span class="built_in">open</span>(local_file, <span class="string">'rb'</span>)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.storbinary(<span class="string">'STOR %s'</span> % remote_file, file_handler, buf_size)</span><br><span class="line"> file_handler.close()</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'上传: %s'</span> % local_file + <span class="string">"成功!"</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">upload_file_tree</span>(<span class="params">self, local_path, remote_path</span>):</span><br><span class="line"> <span class="string">"""从本地上传目录下多个文件到ftp</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> local_path: 本地路径</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_path: 远程路径</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.isdir(local_path):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'本地目录 %s 不存在'</span> % local_path)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(remote_path)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">'切换至远程目录: %s'</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"></span><br><span class="line"> local_name_list = os.listdir(local_path)</span><br><span class="line"> <span class="keyword">for</span> local_name <span class="keyword">in</span> local_name_list:</span><br><span class="line"> src = os.path.join(local_path, local_name)</span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(src):</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="variable language_">self</span>.ftp.mkd(local_name)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"目录已存在 %s ,具体错误描述为:%s"</span> % (local_name, err))</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"upload_file_tree()---> 上传目录: %s"</span> % local_name)</span><br><span class="line"> <span class="variable language_">self</span>.upload_file_tree(src, local_name)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"upload_file_tree()---> 上传文件: %s"</span> % local_name)</span><br><span class="line"> <span class="variable language_">self</span>.upload_file(src, local_name)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(<span class="string">".."</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">close</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="string">""" 退出ftp</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">"close()---> FTP退出"</span>)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.quit()</span><br><span class="line"> <span class="variable language_">self</span>.log_file.close()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">debug_print</span>(<span class="params">self, s</span>):</span><br><span class="line"> <span class="string">""" 打印日志</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="variable language_">self</span>.write_log(s)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">deal_error</span>(<span class="params">self, e</span>):</span><br><span class="line"> <span class="string">""" 处理错误异常</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> e:异常</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> log_str = <span class="string">'发生错误: %s'</span> % e</span><br><span class="line"> <span class="variable language_">self</span>.write_log(log_str)</span><br><span class="line"> sys.exit()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">write_log</span>(<span class="params">self, log_str</span>):</span><br><span class="line"> <span class="string">""" 记录日志</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> log_str:日志</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> time_now = time.localtime()</span><br><span class="line"> date_now = time.strftime(<span class="string">'%Y-%m-%d'</span>, time_now)</span><br><span class="line"> format_log_str = <span class="string">"%s ---> %s \n "</span> % (date_now, log_str)</span><br><span class="line"> <span class="built_in">print</span>(format_log_str)</span><br><span class="line"> <span class="variable language_">self</span>.log_file.write(format_log_str)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_file_list</span>(<span class="params">self, line</span>):</span><br><span class="line"> <span class="string">""" 获取文件列表</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> line:</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> file_arr = <span class="variable language_">self</span>.get_file_name(line)</span><br><span class="line"> <span class="comment"># 去除 . 和 ..</span></span><br><span class="line"> <span class="keyword">if</span> file_arr[<span class="number">1</span>] <span class="keyword">not</span> <span class="keyword">in</span> [<span class="string">'.'</span>, <span class="string">'..'</span>]:</span><br><span class="line"> <span class="variable language_">self</span>.file_list.append(file_arr)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_file_name</span>(<span class="params">self, line</span>):</span><br><span class="line"> <span class="string">""" 获取文件名</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> line:</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> pos = line.rfind(<span class="string">':'</span>)</span><br><span class="line"> <span class="keyword">while</span> (line[pos] != <span class="string">' '</span>):</span><br><span class="line"> pos += <span class="number">1</span></span><br><span class="line"> <span class="keyword">while</span> (line[pos] == <span class="string">' '</span>):</span><br><span class="line"> pos += <span class="number">1</span></span><br><span class="line"> file_arr = [line[<span class="number">0</span>], line[pos:]]</span><br><span class="line"> <span class="keyword">return</span> file_arr</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</span><br><span class="line"> <span class="comment"># 清除日志</span></span><br><span class="line"> path = os.path.dirname(os.path.realpath(__file__)) <span class="comment"># 脚本路径</span></span><br><span class="line"> <span class="keyword">if</span> os.path.exists(path + <span class="string">'/log.txt'</span>):</span><br><span class="line"> log_file = path + <span class="string">'/log.txt '</span><span class="keyword">if</span> os.sep == <span class="string">"/"</span> <span class="keyword">else</span> path + <span class="string">'\\'</span> + <span class="string">'log.txt'</span></span><br><span class="line"> subprocess.Popen(<span class="string">f'rm -rf <span class="subst">{log_file}</span>'</span>, shell=<span class="literal">True</span>)</span><br><span class="line"> time.sleep(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"> my_ftp = MyFTP(<span class="string">"xxx.ftp.upyun.com"</span>)</span><br><span class="line"> my_ftp.login(<span class="string">"xxx/xxx"</span>, <span class="string">"xxx"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 下载单个文件</span></span><br><span class="line"> <span class="comment"># my_ftp.download_file("E:/code_zone/image_bed/image/wallpaper/1.jpg", "/image/wallpaper/1.jpg")</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 上传单个文件</span></span><br><span class="line"> <span class="comment"># my_ftp.upload_file("G:/ftp_test/Release/XTCLauncher.apk", "/App/AutoUpload/ouyangpeng/I12/Release/XTCLauncher.apk")</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 下载目录</span></span><br><span class="line"> <span class="comment"># image.cpen.top/image/ → 本地 E:/code_zone/image_bed/image/ (本地图床目录, 又拍云路径)</span></span><br><span class="line"> <span class="keyword">if</span> os.sep == <span class="string">"\\"</span>:</span><br><span class="line"> my_ftp.download_file_tree(<span class="string">"E:/code_zone/image_bed/image/"</span>, <span class="string">"/image/"</span>)</span><br><span class="line"> <span class="keyword">elif</span> os.sep == <span class="string">"/"</span>: <span class="comment"># aliyun</span></span><br><span class="line"> my_ftp.download_file_tree(<span class="string">"/root/code_zone/image_bed/image/"</span>, <span class="string">"/image/"</span>)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 上传目录</span></span><br><span class="line"> <span class="comment"># 本地 E:/code_zone/image_bed/image/ → image.cpen.top/image/ (本地图床目录, 又拍云路径)</span></span><br><span class="line"> <span class="keyword">if</span> os.sep == <span class="string">"\\"</span>: <span class="comment"># Windows</span></span><br><span class="line"> my_ftp.upload_file_tree(<span class="string">"E:/code_zone/image_bed/image/"</span>, <span class="string">"/image/"</span>) </span><br><span class="line"> my_ftp.close()</span><br><span class="line"> <span class="keyword">elif</span> os.sep == <span class="string">"/"</span>: <span class="comment"># aliyun</span></span><br><span class="line"> my_ftp.upload_file_tree(<span class="string">"/root/code_zone/image_bed/image/"</span>, <span class="string">"/image/"</span>) </span><br><span class="line"> my_ftp.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># python E:/code_zone/tools/python-ftp/ftp.py</span></span><br><span class="line"><span class="comment"># python3 /root/code_zone/tools/python-ftp/ftp.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>2.2.2</strong> 说明</p><p><code>my_ftp.login("用户名xxx/xxx", "密码xxx")</code> 参考 <a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">https://techs.upyun.com/videos/cdnpage/creating_storage.html</a></p><p>后期又将脚本传到云服务器上,通过计划任务,每15分钟同步,保持 GitHub 与又拍云图床一致</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># root @ CentOS in ~ [18:05:59]</span></span><br><span class="line">$ crontab -l</span><br><span class="line">*/15 * * * * <span class="built_in">cd</span> /root/code_zone/image_bed/; git pull; python3 /root/code_zone/tools/python-ftp/ftp.py; bash git.sh</span><br></pre></td></tr></table></figure><p>迁移好图床后,博客中调用图片资源时 浏览器自动 http 跳 https,因为没有证书导致图片失效,于是又申请了 ssl 证书,上传至又拍云。</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220910180219146.png" alt=""></p></blockquote><h3 id="2-3-编写批量修改文章内容的脚本">2.3 编写批量修改文章内容的脚本<a class="header-anchor" href="#2-3-编写批量修改文章内容的脚本"></a></h3><p>源码参考<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">https://blog.csdn.net/qq_38150250/article/details/118026219</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 源码参考 https://blog.csdn.net/qq_38150250/article/details/118026219</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="comment"># 文件查找 find . -name file_name -type f</span></span><br><span class="line"><span class="comment"># 查找函数:search_path 查找根路径 </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取文章路径</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">search</span>(<span class="params">search_path, search_result</span>):</span><br><span class="line"> <span class="comment"># 获取当前路径下地所有文件</span></span><br><span class="line"> all_file = os.listdir(search_path)</span><br><span class="line"> <span class="comment"># 对于每一个文件</span></span><br><span class="line"> <span class="keyword">for</span> each_file <span class="keyword">in</span> all_file:</span><br><span class="line"> <span class="comment"># 若文件为一个文件夹</span></span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(search_path + each_file):</span><br><span class="line"> <span class="comment"># 递归查找</span></span><br><span class="line"> search(search_path + each_file + <span class="string">'/'</span>, search_result)</span><br><span class="line"> <span class="comment"># 如果是需要被查找的文件</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">if</span> re.findall(<span class="string">'.*\.md$'</span>, each_file) == [each_file]:</span><br><span class="line"> <span class="comment"># 输出路径</span></span><br><span class="line"> search_result.append(search_path + each_file)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 替换 sed -i 's/old_str/new_str/'</span></span><br><span class="line"><span class="comment"># 文本替换 replace_file_name 需要替换的文件路径,replace_old_str 要替换的字符,replace_new_str 替换的字符</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">replace</span>(<span class="params">replace_file_name, replace_old_str, replace_new_str</span>):</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">"r"</span>, encoding = <span class="string">"UTF-8"</span>) <span class="keyword">as</span> f1: </span><br><span class="line"> content = f1.read()</span><br><span class="line"> f1.close()</span><br><span class="line"> t = content.replace(replace_old_str, replace_new_str)</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">"w"</span>, encoding = <span class="string">"UTF-8"</span>) <span class="keyword">as</span> f2:</span><br><span class="line"> f2.write(t)</span><br><span class="line"> f2.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 需要改的地方</span></span><br><span class="line"><span class="comment">#path = 'E:/code_zone/.history/20220831_blog/source/_posts/'</span></span><br><span class="line">path_list = [</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source/source/_posts/'</span>,</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source-butterfly/source/_posts/'</span>,</span><br><span class="line"> <span class="string">'E:/code_zone/hexo-source-diary/source/_posts/'</span>,</span><br><span class="line">]</span><br><span class="line">old_str = <span class="string">'https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-fzanaoacgl/image/'</span></span><br><span class="line">new_str = <span class="string">'https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-fzanaoacgl/image/'</span></span><br><span class="line">search_result = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> result = [] <span class="comment"># 存放文件路径</span></span><br><span class="line"> <span class="comment"># 默认当前目录</span></span><br><span class="line"> <span class="comment"># path = os.getcwd()</span></span><br><span class="line"> <span class="keyword">for</span> path <span class="keyword">in</span> path_list:</span><br><span class="line"> search(path, result) <span class="comment"># 获取文章路径</span></span><br><span class="line"> count = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> file_name <span class="keyword">in</span> result:</span><br><span class="line"> replace(file_name, old_str, new_str)</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"{} done {}"</span>.<span class="built_in">format</span>(file_name, count))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># python E:/code_zone/tools/python-replace/replace.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>2.3.1</strong> 说明</p><p><code>search</code>函数指定文件类型为 .md,可获得文章的完整路径;</p><p><code>path_list</code>列表存放需要修改的文章父目录路径,可以递归查询子目录;</p><p><code>old_str</code>需要替换的内容</p><p><code>new_str</code>新内容</p>]]></content>
|
|
1045
1045
|
|
|
1046
1046
|
|
|
1047
1047
|
<categories>
|
|
@@ -1342,7 +1342,7 @@
|
|
|
1342
1342
|
<link href="/posts/65154.html"/>
|
|
1343
1343
|
<url>/posts/65154.html</url>
|
|
1344
1344
|
|
|
1345
|
-
<content type="html"><![CDATA[<p><a href="https://www.bilibili.com/video/BV1vK4y1o7jH">视频链接:https://www.bilibili.com/video/BV1vK4y1o7jH</a></p><h2 id="一-模板层-变量和标签">一. 模板层 - 变量和标签<a class="header-anchor" href="#一-模板层-变量和标签"></a></h2><h3 id="变量">变量<a class="header-anchor" href="#变量"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>视图函数中可以将Python变量封装到 <strong>字典</strong> 中传递到模板上</p></li></ul><p>样例:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">xxx_view</span>(<span class="params">request</span>):</span><br><span class="line"> dic = {</span><br><span class="line"> <span class="string">"变量1"</span>: <span class="string">"值1"</span>,</span><br><span class="line"> <span class="string">"变量2"</span>: <span class="string">"值2"</span>,</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'xxx.html'</span>, dic)</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>能传递到模板中的 <strong>数据类型</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">str-字符串int-整型</span><br><span class="line">list-数组tuple-元组</span><br><span class="line">dict-字典func-方法</span><br><span class="line">obj-类实例化的对象</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>在模板中使用变量语法</p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">- {{ 变量名 }}</span><br><span class="line">- {{ 变量名.index }}</span><br><span class="line">- {{ 变量名.key }}</span><br><span class="line">- {{ 对象.方法 }}</span><br><span class="line">- {{ 函数名 }}</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>演示:</p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test_html_param</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160138597.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'test_html'</span>, views.test_html)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_html_param</span>(<span class="params">request</span>):</span><br><span class="line"> dic = {}</span><br><span class="line"> dic[<span class="string">'int'</span>] = <span class="number">88</span></span><br><span class="line"> dic[<span class="string">'str'</span>] = <span class="string">'peng'</span></span><br><span class="line"> dic[<span class="string">'lst'</span>] = [<span class="string">'Tom'</span>, <span class="string">'Jack'</span>, <span class="string">'Lily'</span>]</span><br><span class="line"> dic[<span class="string">'dict'</span>] = {<span class="string">'a'</span>:<span class="number">9</span>, <span class="string">'b'</span>:<span class="number">8</span>}</span><br><span class="line"> dic[<span class="string">'func'</span>] = say_hi</span><br><span class="line"> dic[<span class="string">'class_obj'</span>] = Dog()</span><br><span class="line"> dic[<span class="string">'script'</span>] = <span class="string">'<script>alert(1111)</script>'</span></span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'test_html_param.html'</span>, dic)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">say_hi</span>():</span><br><span class="line"> <span class="keyword">return</span> <span class="string">'hahaha'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Dog</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">say</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="string">'wangwang'</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/test_html_param.html</span></span><br><span class="line"><h3><span class="built_in">int</span> 是 {{ <span class="built_in">int</span>|add:<span class="string">"2"</span> }}</h3></span><br><span class="line"><h3><span class="built_in">str</span> 是 {{ <span class="built_in">str</span>|upper }}</h3></span><br><span class="line"><h3>lst 是 {{ lst }}</h3></span><br><span class="line"><h3>lst 是 {{ lst<span class="number">.0</span> }}</h3></span><br><span class="line"><h3><span class="built_in">dict</span> 是 {{ <span class="built_in">dict</span> }}</h3></span><br><span class="line"><h3><span class="built_in">dict</span>[<span class="string">'a'</span>] 是 {{ <span class="built_in">dict</span>.a }}</h3></span><br><span class="line"><h3>function 是 {{ func }}</h3></span><br><span class="line"><h3>class_obj 是 {{ class_obj.say }}</h3></span><br><span class="line"><h3>script 是 {{ script|safe }}</h3></span><br></pre></td></tr></table></figure><hr><h3 id="标签">标签<a class="header-anchor" href="#标签"></a></h3><p><strong>模板标签</strong></p><ul class="lvl-0"><li class="lvl-2"><p>作用:将一些服务器端的功能嵌入到模板中,例如流程控制等</p></li><li class="lvl-2"><p>标签语法:</p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% 标签 %}</span><br><span class="line">...</span><br><span class="line">{% 结束标签 %}</span><br></pre></td></tr></table></figure><h4 id="if标签">if标签<a class="header-anchor" href="#if标签"></a></h4><ul class="lvl-0"><li class="lvl-2"><p><strong>语法</strong>:</p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">{% if 条件表达式1 %}</span><br><span class="line">...</span><br><span class="line">{% elif 条件表达式2 %}</span><br><span class="line">...</span><br><span class="line">{% elif 条件表达式3 %}</span><br><span class="line">...</span><br><span class="line">{% else %}</span><br><span class="line">...</span><br><span class="line">{% endif %}- 需要有结束标签</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><strong>注意</strong>:</p></li></ul><ol><li class="lvl-3"><p>if条件表达式里可以用的运算符 ==, !=, <, > , <=, >=, in, not in, is, is not, not、and、or</p></li><li class="lvl-3"><p>在if标记中使用实际括号是无效的语法。如果需要它们指示优先级,则应使用嵌套的if标记。</p></li></ol><p>官方文档:<a href="https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/#if">https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/#if</a></p><ul class="lvl-0"><li class="lvl-2"><p><strong>演示:</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test_if_for</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160204292.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'test_if_for'</span>, views.test_if_for),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_if_for</span>(<span class="params">request</span>):</span><br><span class="line"> dic = {}</span><br><span class="line"> dic[<span class="string">'x'</span>] = <span class="number">20</span></span><br><span class="line"> dic[<span class="string">'lst'</span>] = [<span class="string">'Tom'</span>, <span class="string">'Jack'</span>, <span class="string">'Lily'</span>]</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'test_if_for.html'</span>, dic)</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/test_if_for.html</span></span><br><span class="line">{% <span class="keyword">if</span> x > <span class="number">10</span> %}</span><br><span class="line">今天天气很好</span><br><span class="line">{% <span class="keyword">else</span> %}</span><br><span class="line">今天天气非常好</span><br><span class="line">{% endif %}</span><br><span class="line"></span><br><span class="line"><br></span><br><span class="line"></span><br><span class="line">{% <span class="keyword">for</span> name <span class="keyword">in</span> lst %}</span><br><span class="line"> {% <span class="keyword">if</span> forloop.first %} &&&&& {% endif %}</span><br><span class="line"> <p> {{ forloop.counter }} {{ name }}</p></span><br><span class="line"> {% <span class="keyword">if</span> forloop.last %} ===== {% endif %}</span><br><span class="line">{% empty %}</span><br><span class="line"> 当前没数据</span><br><span class="line">{% endfor %}</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><strong>模板标签 - if标签 - 练习</strong></p><p>写一个简单的计算器页面,能够在服务端进行简单加减乘除计算(需记录用户上次填写状态、下拉列表选择状态)</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160209924.png" alt=""></p><ul class="lvl-2"><li class="lvl-4"><p>前端参考代码:</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160215265.png" alt=""></p></li><li class="lvl-4"><p><strong>演示:</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/mycal</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160235992.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'mycal'</span>, views.test_mycal),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_mycal</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">if</span> request.method == <span class="string">'GET'</span>:</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'mycal.html'</span>)</span><br><span class="line"> <span class="keyword">elif</span> request.method == <span class="string">'POST'</span>:</span><br><span class="line"> <span class="comment">#处理计算</span></span><br><span class="line"> x = <span class="built_in">int</span>(request.POST[<span class="string">'x'</span>])</span><br><span class="line"> y = <span class="built_in">int</span>(request.POST[<span class="string">'y'</span>])</span><br><span class="line"> op = request.POST[<span class="string">'op'</span>]</span><br><span class="line"></span><br><span class="line"> result = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> op == <span class="string">'add'</span>:</span><br><span class="line"> result = x + y</span><br><span class="line"> <span class="keyword">elif</span> op == <span class="string">'sub'</span>:</span><br><span class="line"> result = x - y</span><br><span class="line"> <span class="keyword">elif</span> op == <span class="string">'mul'</span>:</span><br><span class="line"> result = x * y</span><br><span class="line"> <span class="keyword">elif</span> op == <span class="string">'div'</span>:</span><br><span class="line"> result = x / y</span><br><span class="line"></span><br><span class="line"> <span class="comment">#dic={'x':x, 'y':y, 'op':op}</span></span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'mycal.html'</span>, <span class="built_in">locals</span>())<span class="comment"># locals方法-局部变量直接封装成字典(Python自带方法)</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/mycal.html</span></span><br><span class="line"><form action=<span class="string">'/mycal'</span> method=<span class="string">'post'</span>></span><br><span class="line"> <<span class="built_in">input</span> <span class="built_in">type</span>=<span class="string">'text'</span> name=<span class="string">"x"</span> value=<span class="string">"{{ x }}"</span>></span><br><span class="line"> <select name=<span class="string">'op'</span>></span><br><span class="line"> <option value=<span class="string">"add"</span> {% <span class="keyword">if</span> op == <span class="string">'add'</span> %}selected{% endif %} > +加</option><span class="comment"># ☆ 记录op状态,option selected属性,使用了if标签</span></span><br><span class="line"> <option value=<span class="string">"sub"</span> {% <span class="keyword">if</span> op == <span class="string">'sub'</span> %}selected{% endif %}> -减</option></span><br><span class="line"> <option value=<span class="string">"mul"</span> {% <span class="keyword">if</span> op == <span class="string">'mul'</span> %}selected{% endif %}> *乘</option></span><br><span class="line"> <option value=<span class="string">"div"</span> {% <span class="keyword">if</span> op == <span class="string">'div'</span> %}selected{% endif %}> /除</option></span><br><span class="line"> </select></span><br><span class="line"> <<span class="built_in">input</span> <span class="built_in">type</span>=<span class="string">'text'</span> name=<span class="string">"y"</span> value=<span class="string">"{{ y }}"</span>> = <span>{{ result }}</span></span><br><span class="line"> <div><<span class="built_in">input</span> <span class="built_in">type</span>=<span class="string">"submit"</span> value=<span class="string">'开始计算'</span>></div></span><br><span class="line"></form></span><br><span class="line"></span><br></pre></td></tr></table></figure></li></ul><h4 id="for标签">for标签<a class="header-anchor" href="#for标签"></a></h4><ul class="lvl-0"><li class="lvl-2"><p><strong>语法:</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">{% for 变量 in 可迭代对象 %}</span><br><span class="line"> ... 循环语句</span><br><span class="line">{% empty %}</span><br><span class="line"> ... 可迭代对象无数据时填充的语句</span><br><span class="line">{% endfor %}</span><br></pre></td></tr></table></figure><p>官方文档:<a href="https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/#for">https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/#for</a></p></li><li class="lvl-2"><p><strong>内置变量 - forloop</strong></p></li></ul><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160246199.png" alt=""></p><ul class="lvl-0"><li class="lvl-2"><p><strong>演示:</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test_if_for</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160254425.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'test_if_for'</span>, views.test_if_for),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_if_for</span>(<span class="params">request</span>):</span><br><span class="line"> dic = {}</span><br><span class="line"> dic[<span class="string">'lst'</span>] = [<span class="string">'Tom'</span>, <span class="string">'Jack'</span>, <span class="string">'Lily'</span>]</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'test_if_for.html'</span>, dic)</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/test_if_for.html</span></span><br><span class="line">{% <span class="keyword">for</span> name <span class="keyword">in</span> lst %}</span><br><span class="line"> {% <span class="keyword">if</span> forloop.first %} &&&&& {% endif %}</span><br><span class="line"> <p> {{ forloop.counter }} {{ name }}</p></span><br><span class="line"> {% <span class="keyword">if</span> forloop.last %} ===== {% endif %}</span><br><span class="line">{% empty %}</span><br><span class="line"> 当前没数据</span><br><span class="line">{% endfor %}</span><br></pre></td></tr></table></figure><h3 id="小节">小节<a class="header-anchor" href="#小节"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>变量调用 - 点大法</p></li><li class="lvl-2"><p>标签语法 {% 标签 %} {% 结束标签 %}</p></li></ul><hr><h2 id="二-模板层-过滤器和继承">二. 模板层 - 过滤器和继承<a class="header-anchor" href="#二-模板层-过滤器和继承"></a></h2><h3 id="过滤器">过滤器<a class="header-anchor" href="#过滤器"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>定义:在变量输出时对变量的值进行处理</p></li><li class="lvl-2"><p>作用:可以通过使用 过滤器 来改变变量的输出显示</p></li><li class="lvl-2"><p>语法:**{{ 变量 | 过滤器1:'参数1' | 过滤器2:'参数2' ... }}**</p></li></ul><p>官方文档:<a href="https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/">https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/</a></p><ul class="lvl-0"><li class="lvl-2"><p><strong>常用过滤器:</strong></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160307400.png" alt=""></p></li><li class="lvl-2"><p>演示:</p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test_html_param</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160312462.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160313992.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'test_html'</span>, views.test_html)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_html_param</span>(<span class="params">request</span>):</span><br><span class="line"> dic = {}</span><br><span class="line"> dic[<span class="string">'int'</span>] = <span class="number">88</span></span><br><span class="line"> dic[<span class="string">'script'</span>] = <span class="string">'<script>alert(1111)</script>'</span></span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'test_html_param.html'</span>, dic)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">say_hi</span>():</span><br><span class="line"> <span class="keyword">return</span> <span class="string">'hahaha'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Dog</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">say</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="string">'wangwang'</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/test_html_param.html</span></span><br><span class="line"><h3><span class="built_in">int</span> 是 {{ <span class="built_in">int</span>|add:<span class="string">"2"</span> }}</h3></span><br><span class="line"><h3><span class="built_in">str</span> 是 {{ <span class="built_in">str</span>|upper }}</h3></span><br><span class="line"><h3>script 是 {{ script|safe }}</h3></span><br></pre></td></tr></table></figure><h3 id="继承">继承<a class="header-anchor" href="#继承"></a></h3><p><strong>模板的继承</strong></p><p>如下样例:</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160321750.png" alt=""></p><ul class="lvl-0"><li class="lvl-2"><p>模板继承可以使父模板的内容重用,子模板直接继承父模板的全部内容并可以覆盖父模板中相应的块</p></li><li class="lvl-2"><p>语法 - 父模板中:</p><ul class="lvl-2"><li class="lvl-4"><input type="checkbox" id="checkbox6" checked="true"><label for="checkbox6">定义父模板中的**块 block **标签</label></li><li class="lvl-4"><input type="checkbox" id="checkbox7" checked="true"><label for="checkbox7">表时出哪些在</label><strong>子模块</strong>中是允许被<strong>修改</strong>的</li><li class="lvl-4"><input type="checkbox" id="checkbox8" checked="true"><label for="checkbox8">block 标签:</label><strong>在父模板中定义,可以在子模板中覆盖</strong></li></ul></li><li class="lvl-2"><p>语法 - 子模板中:</p><ul class="lvl-2"><li class="lvl-4"><p><input type="checkbox" id="checkbox9" checked="true"><label for="checkbox9">继承模板 </label><code>extends</code> 标签(写在模板文件的第一行)</p><p>例如 <code>{% extends 'base.html' %}</code></p></li><li class="lvl-4"><p><input type="checkbox" id="checkbox10" checked="true"><label for="checkbox10">子模板 重写父模板中的内容块</label></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% block block_name %}</span><br><span class="line">子模板块用来覆盖父模板中 block_name 块的内容</span><br><span class="line">{% endblock block_name %}- block_name 可写可不写</span><br></pre></td></tr></table></figure></li></ul></li><li class="lvl-2"><p>重写的覆盖规则</p><ul class="lvl-2"><li class="lvl-4"><input type="checkbox" id="checkbox11" checked="true"><label for="checkbox11">不重写,将按照父模板中的效果显示</label></li><li class="lvl-4"><input type="checkbox" id="checkbox12" checked="true"><label for="checkbox12">重写,则按照重写效果显示</label></li></ul></li><li class="lvl-2"><p>注意</p><ul class="lvl-2"><li class="lvl-4"><input type="checkbox" id="checkbox13" checked="true"><label for="checkbox13">模板继承时,服务器端的动态内容无法继承</label></li></ul></li><li class="lvl-2"><p><strong>演示:</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/base_index</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161504056.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161504615.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'base_index'</span>, views.base_view, name=<span class="string">'base_index'</span>),</span><br><span class="line"> path(<span class="string">'music_index'</span>, views.music_view),</span><br><span class="line"> path(<span class="string">'sport_index'</span>, views.sport_view),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">base_view</span>(<span class="params">request</span>):</span><br><span class="line"> lst = [<span class="string">'Tom'</span>, <span class="string">'Jack'</span>]</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'base.html'</span>, <span class="built_in">locals</span>())</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">music_view</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'music.html'</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sport_view</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'sport.html'</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># mysite1/templates/base.html# 父模板</span></span><br><span class="line"><!DOCTYPE html></span><br><span class="line"><html lang=<span class="string">"en"</span>></span><br><span class="line"><head></span><br><span class="line"> <meta charset=<span class="string">"UTF-8"</span>></span><br><span class="line"> {% block mytitle %}</span><br><span class="line"> <title>主页</title><span class="comment"># 子模板能改的地方</span></span><br><span class="line"> {% endblock %}</span><br><span class="line"></head></span><br><span class="line"><body></span><br><span class="line">{{ lst }}<span class="comment"># 子模板无法继承变量(动态内容)</span></span><br><span class="line"><a href=<span class="string">"/music_index"</span>>音乐频道</a><span class="comment"># 子模板不能改</span></span><br><span class="line"><a href=<span class="string">"/sport_index"</span>>体育频道</a></span><br><span class="line"><br></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">{% block info %}</span><br><span class="line"> 这是主页<span class="comment"># 子模板能改的地方</span></span><br><span class="line">{% endblock %}</span><br><span class="line"></span><br><span class="line"><br></span><br><span class="line"></span><br><span class="line"><h3>有任何问题联系xxxx</h3><span class="comment"># 子模板不能改</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/music.html# 子模板</span></span><br><span class="line">{% extends <span class="string">'base.html'</span> %}<span class="comment"># 继承父模板</span></span><br><span class="line"></span><br><span class="line">{% block mytitle %}</span><br><span class="line"> <title>音乐频道</title><span class="comment"># 子模板重写block</span></span><br><span class="line">{% endblock %}</span><br><span class="line"></span><br><span class="line">{% block info %}</span><br><span class="line"> 欢迎来到音乐频道</span><br><span class="line">{% endblock %}</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/sport.html</span></span><br><span class="line">{% extends <span class="string">'base.html'</span> %}</span><br><span class="line"></span><br><span class="line">{% block mytitle %}</span><br><span class="line"> <title>体育频道</title></span><br><span class="line">{% endblock %}</span><br><span class="line"></span><br><span class="line">{% block info %}</span><br><span class="line"> 欢迎来到体育频道</span><br><span class="line">{% endblock %}</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="小节-2">小节<a class="header-anchor" href="#小节-2"></a></h3><ul class="lvl-0"><li class="lvl-2"><p><strong>过滤器</strong></p><p>{ <code>变量</code> | <code>过滤器</code>1:‘<code>参数值</code>1’ | 过滤器2:‘参数值2’ … }</p></li><li class="lvl-2"><p><strong>模板的继承</strong></p><p>父模板 - <code>定义可被修改的block</code></p><p>子模板 - 继承<code>父模板</code>;按需修改<code>父模板中定义的block</code></p></li></ul><hr><h2 id="三-url反向解析">三. url反向解析<a class="header-anchor" href="#三-url反向解析"></a></h2><ul class="lvl-0"><li class="lvl-2"><p><strong>代码中 url 出现位置</strong></p><ol><li class="lvl-5"><p><mark>模板</mark> 【html中】</p><ol><li class="lvl-8"><p><a <mark>href</mark>=‘url’>超链接</a></p><p>点击后 页面跳转至 url</p></li><li class="lvl-8"><p><form <mark>action</mark>=‘url’ method=‘post’></p><p>form表单中的数据 用post方法提交至 url</p></li></ol></li><li class="lvl-5"><p><mark>视图函数</mark>中 - 302跳转 HttpResponseRedirect(‘url’)</p><p>将用户地址栏中的地址跳转到 url</p></li></ol></li><li class="lvl-2"><p><strong>代码中 url 书写规范</strong></p><ol><li class="lvl-5"><p><mark>绝对地址</mark></p><p><a href="http://127.0.0.1:8000/page/1">http://127.0.0.1:8000/page/1</a></p></li><li class="lvl-5"><p><mark>相对地址</mark></p><ol><li class="lvl-8">‘==/==page/1’ -<mark>‘/’ 开头的相对地址</mark>,浏览器会把当前地址栏里的 协议,ip 和 端口 加上这个地址,作为最终访问地址,即如果当前页面地址栏为 <a href="http://127.0.0.1:8000/page/3%EF%BC%9B%E5%BD%93%E5%89%8D%E7%9B%B8%E5%AF%B9%E5%9C%B0%E5%9D%80%E6%9C%80%E7%BB%88%E7%BB%93%E6%9E%9C%E4%B8%BA">http://127.0.0.1:8000/page/3;当前相对地址最终结果为</a> <mark><code>http://127.0.0.1:8000</code></mark> + /page/1(☆ 高频使用)</li><li class="lvl-8">‘page/1’ -<mark>没有 ‘/’ 开头的相对地址</mark>,浏览器会根据<code>当前 url 的最后一个 / 之前的内容 加上 该相对地址</code> 作为最终访问地址,例如当前地址栏地址为 ==<a href="http://127.0.0.1:8000/topic/==detail%EF%BC%9B%E5%88%99%E8%AF%A5%E7%9B%B8%E5%AF%B9%E5%9C%B0%E5%9D%80%E6%9C%80%E7%BB%88%E7%BB%93%E6%9E%9C%E4%B8%BA">http://127.0.0.1:8000/topic/==detail;则该相对地址最终结果为</a> <mark><code>http://127.0.0.1:8000/topic/</code></mark> + page/1</li></ol></li></ol></li><li class="lvl-2"><p><strong>演示:</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test/url</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161656031.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161657095.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161702913.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> <span class="comment"># http://127.0.0.1:8000/test/url</span></span><br><span class="line"> path(<span class="string">'test/url'</span>, views.test_url),</span><br><span class="line"> path(<span class="string">'test_url_result'</span>, views.test_url_result)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_url</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'test_url.html'</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_url_result</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">return</span> HttpResponse(<span class="string">'---test url res is ok'</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/test_url.html</span></span><br><span class="line"><a href=<span class="string">"http://127.0.0.1:8000/test_url_result"</span>>绝对地址</a></span><br><span class="line"><a href=<span class="string">"/test_url_result"</span>>带<span class="string">'/'</span>的相对地址</a></span><br><span class="line"><a href=<span class="string">"test_url_result"</span>>不带<span class="string">'/'</span>的相对地址</a><span class="comment"># 浏览器解析为 http://127.0.0.1:8000/test/test_url_result</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><strong>url 反向解析</strong></p><ul class="lvl-2"><li class="lvl-4"><p>url 反向解析是指在视图或者模板中,用 <mark>path 定义的名称</mark>来<mark>动态查找或计算出相应的路由</mark></p></li><li class="lvl-4"><p><strong>path 函数的语法</strong></p><ul class="lvl-4"><li class="lvl-6"><input type="checkbox" id="checkbox14" checked="true"><label for="checkbox14">path(route, views, </label><mark>name</mark>=“别名”)</li><li class="lvl-6"><input type="checkbox" id="checkbox15" checked="true"><label for="checkbox15">path(‘page’, views.page_view, name=“page_url”)</label></li><li class="lvl-6">根据 path 中的 ‘name=’ 关键字传给 url 确定了个唯一确定的名字,在模板或视图中,可以通过这个名字反向推断出此 url 信息</li></ul></li><li class="lvl-4"><p><mark>模板中</mark> - 通过 url 标签实现地址的反向解析</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">{% url '别名' %}</span><br><span class="line">{% url '别名' '参数值1' '参数值2' %}</span><br><span class="line">ex:</span><br><span class="line">{% url 'pagen' '400' %}--- 传参一律是 str</span><br><span class="line">{% url 'person' age='18' name='gxn' %}</span><br></pre></td></tr></table></figure><ul class="lvl-4"><li class="lvl-6"><p><strong>演示:在模板中使用</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test/url</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161725987.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> <span class="comment"># http://127.0.0.1:8000/test/url</span></span><br><span class="line"> path(<span class="string">'test/url'</span>, views.test_url),</span><br><span class="line"> path(<span class="string">'test_urls_result/<int:age>'</span>, views.test_url_result, name=<span class="string">'tr'</span>)<span class="comment"># 起别名 tr</span></span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_url</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'test_url.html'</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_urls_result</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">return</span> HttpResponse(<span class="string">'---test url res is ok'</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/test_url.html</span></span><br><span class="line"><a href=<span class="string">"{% url 'tr' '100' %}"</span>>url反向解析版本</a><span class="comment"># ☆ 模板中使用别名</span></span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li class="lvl-4"><p>在<mark>视图函数</mark>中 → 可调用 django 中的 <mark>reverse</mark> 方法进行反向解析</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> django.urls <span class="keyword">import</span> reverse</span><br><span class="line">reverse(<span class="string">'别名'</span>, args=[], kwargs={})</span><br><span class="line">ex:</span><br><span class="line"><span class="built_in">print</span>(reverse(<span class="string">'pagen'</span>, args=[<span class="number">300</span>]))</span><br><span class="line"><span class="built_in">print</span>(reverse(<span class="string">'person'</span>, kwargs=</span><br><span class="line">{<span class="string">'name'</span>:<span class="string">'peng'</span>, <span class="string">'age'</span>:<span class="number">23</span>}))</span><br><span class="line"></span><br></pre></td></tr></table></figure><ul class="lvl-4"><li class="lvl-6"><p>演示:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test/url</span><br><span class="line"></span><br><span class="line"># 302跳转 - 响应头里的 location 标记跳转地址</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161742771.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161745717.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'base_index'</span>, views.base_view, name=<span class="string">'base_index'</span>),<span class="comment"># 起别名 base_index</span></span><br><span class="line"> <span class="comment"># http://127.0.0.1:8000/test/url</span></span><br><span class="line"> path(<span class="string">'test/url'</span>, views.test_url),</span><br><span class="line"> path(<span class="string">'test_urls_result/<int:age>'</span>, views.test_url_result, name=<span class="string">'tr'</span>)<span class="comment"># 起别名 tr</span></span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">base_view</span>(<span class="params">request</span>):</span><br><span class="line"> lst = [<span class="string">'Tom'</span>, <span class="string">'Jack'</span>]</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'base.html'</span>, <span class="built_in">locals</span>())</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_url</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'test_url.html'</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_url_result</span>(<span class="params">request, age</span>):</span><br><span class="line"> <span class="comment">#302跳转</span></span><br><span class="line"> <span class="keyword">from</span> django.urls <span class="keyword">import</span> reverse</span><br><span class="line"> url = reverse(<span class="string">'base_index'</span>)<span class="comment"># ☆ 视图函数中使用别名</span></span><br><span class="line"> <span class="keyword">return</span> HttpResponseRedirect(url)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#---------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># mysite1/templates/test_url.html</span></span><br><span class="line"><a href=<span class="string">"{% url 'tr' '100' %}"</span>>url反向解析版本</a></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/base.html</span></span><br><span class="line">略</span><br><span class="line"></span><br></pre></td></tr></table></figure></li></ul></li></ul></li></ul><h2 id="四-总结">四. 总结<a class="header-anchor" href="#四-总结"></a></h2><ul class="lvl-0"><li class="lvl-2"><p>请求(request)和响应(HttpResponseqing)</p></li><li class="lvl-2"><p>GET/POST处理 - request.GET/POST</p></li><li class="lvl-2"><p>MVC 和 MTV</p></li><li class="lvl-2"><p>模板层基础配置</p></li><li class="lvl-2"><p>模板变量/标签/过滤器/继承</p></li><li class="lvl-2"><p>url反向解析</p></li></ul><hr>]]></content>
|
|
1345
|
+
<content type="html"><![CDATA[<p><a href="https://www.bilibili.com/video/BV1vK4y1o7jH">视频链接:https://www.bilibili.com/video/BV1vK4y1o7jH</a></p><h2 id="一-模板层-变量和标签">一. 模板层 - 变量和标签<a class="header-anchor" href="#一-模板层-变量和标签"></a></h2><h3 id="变量">变量<a class="header-anchor" href="#变量"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>视图函数中可以将Python变量封装到 <strong>字典</strong> 中传递到模板上</p></li></ul><p>样例:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">xxx_view</span>(<span class="params">request</span>):</span><br><span class="line"> dic = {</span><br><span class="line"> <span class="string">"变量1"</span>: <span class="string">"值1"</span>,</span><br><span class="line"> <span class="string">"变量2"</span>: <span class="string">"值2"</span>,</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'xxx.html'</span>, dic)</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>能传递到模板中的 <strong>数据类型</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">str-字符串int-整型</span><br><span class="line">list-数组tuple-元组</span><br><span class="line">dict-字典func-方法</span><br><span class="line">obj-类实例化的对象</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>在模板中使用变量语法</p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">- {{ 变量名 }}</span><br><span class="line">- {{ 变量名.index }}</span><br><span class="line">- {{ 变量名.key }}</span><br><span class="line">- {{ 对象.方法 }}</span><br><span class="line">- {{ 函数名 }}</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>演示:</p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test_html_param</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160138597.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'test_html'</span>, views.test_html)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_html_param</span>(<span class="params">request</span>):</span><br><span class="line"> dic = {}</span><br><span class="line"> dic[<span class="string">'int'</span>] = <span class="number">88</span></span><br><span class="line"> dic[<span class="string">'str'</span>] = <span class="string">'peng'</span></span><br><span class="line"> dic[<span class="string">'lst'</span>] = [<span class="string">'Tom'</span>, <span class="string">'Jack'</span>, <span class="string">'Lily'</span>]</span><br><span class="line"> dic[<span class="string">'dict'</span>] = {<span class="string">'a'</span>:<span class="number">9</span>, <span class="string">'b'</span>:<span class="number">8</span>}</span><br><span class="line"> dic[<span class="string">'func'</span>] = say_hi</span><br><span class="line"> dic[<span class="string">'class_obj'</span>] = Dog()</span><br><span class="line"> dic[<span class="string">'script'</span>] = <span class="string">'<script>alert(1111)</script>'</span></span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'test_html_param.html'</span>, dic)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">say_hi</span>():</span><br><span class="line"> <span class="keyword">return</span> <span class="string">'hahaha'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Dog</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">say</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="string">'wangwang'</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/test_html_param.html</span></span><br><span class="line"><h3><span class="built_in">int</span> 是 {{ <span class="built_in">int</span>|add:<span class="string">"2"</span> }}</h3></span><br><span class="line"><h3><span class="built_in">str</span> 是 {{ <span class="built_in">str</span>|upper }}</h3></span><br><span class="line"><h3>lst 是 {{ lst }}</h3></span><br><span class="line"><h3>lst 是 {{ lst<span class="number">.0</span> }}</h3></span><br><span class="line"><h3><span class="built_in">dict</span> 是 {{ <span class="built_in">dict</span> }}</h3></span><br><span class="line"><h3><span class="built_in">dict</span>[<span class="string">'a'</span>] 是 {{ <span class="built_in">dict</span>.a }}</h3></span><br><span class="line"><h3>function 是 {{ func }}</h3></span><br><span class="line"><h3>class_obj 是 {{ class_obj.say }}</h3></span><br><span class="line"><h3>script 是 {{ script|safe }}</h3></span><br></pre></td></tr></table></figure><hr><h3 id="标签">标签<a class="header-anchor" href="#标签"></a></h3><p><strong>模板标签</strong></p><ul class="lvl-0"><li class="lvl-2"><p>作用:将一些服务器端的功能嵌入到模板中,例如流程控制等</p></li><li class="lvl-2"><p>标签语法:</p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% 标签 %}</span><br><span class="line">...</span><br><span class="line">{% 结束标签 %}</span><br></pre></td></tr></table></figure><h4 id="if标签">if标签<a class="header-anchor" href="#if标签"></a></h4><ul class="lvl-0"><li class="lvl-2"><p><strong>语法</strong>:</p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">{% if 条件表达式1 %}</span><br><span class="line">...</span><br><span class="line">{% elif 条件表达式2 %}</span><br><span class="line">...</span><br><span class="line">{% elif 条件表达式3 %}</span><br><span class="line">...</span><br><span class="line">{% else %}</span><br><span class="line">...</span><br><span class="line">{% endif %}- 需要有结束标签</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><strong>注意</strong>:</p></li></ul><ol><li class="lvl-3"><p>if条件表达式里可以用的运算符 ==, !=, <, > , <=, >=, in, not in, is, is not, not、and、or</p></li><li class="lvl-3"><p>在if标记中使用实际括号是无效的语法。如果需要它们指示优先级,则应使用嵌套的if标记。</p></li></ol><p>官方文档:<a href="https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/#if">https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/#if</a></p><ul class="lvl-0"><li class="lvl-2"><p><strong>演示:</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test_if_for</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160204292.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'test_if_for'</span>, views.test_if_for),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_if_for</span>(<span class="params">request</span>):</span><br><span class="line"> dic = {}</span><br><span class="line"> dic[<span class="string">'x'</span>] = <span class="number">20</span></span><br><span class="line"> dic[<span class="string">'lst'</span>] = [<span class="string">'Tom'</span>, <span class="string">'Jack'</span>, <span class="string">'Lily'</span>]</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'test_if_for.html'</span>, dic)</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/test_if_for.html</span></span><br><span class="line">{% <span class="keyword">if</span> x > <span class="number">10</span> %}</span><br><span class="line">今天天气很好</span><br><span class="line">{% <span class="keyword">else</span> %}</span><br><span class="line">今天天气非常好</span><br><span class="line">{% endif %}</span><br><span class="line"></span><br><span class="line"><br></span><br><span class="line"></span><br><span class="line">{% <span class="keyword">for</span> name <span class="keyword">in</span> lst %}</span><br><span class="line"> {% <span class="keyword">if</span> forloop.first %} &&&&& {% endif %}</span><br><span class="line"> <p> {{ forloop.counter }} {{ name }}</p></span><br><span class="line"> {% <span class="keyword">if</span> forloop.last %} ===== {% endif %}</span><br><span class="line">{% empty %}</span><br><span class="line"> 当前没数据</span><br><span class="line">{% endfor %}</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><strong>模板标签 - if标签 - 练习</strong></p><p>写一个简单的计算器页面,能够在服务端进行简单加减乘除计算(需记录用户上次填写状态、下拉列表选择状态)</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160209924.png" alt=""></p><ul class="lvl-2"><li class="lvl-4"><p>前端参考代码:</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160215265.png" alt=""></p></li><li class="lvl-4"><p><strong>演示:</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/mycal</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160235992.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'mycal'</span>, views.test_mycal),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_mycal</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">if</span> request.method == <span class="string">'GET'</span>:</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'mycal.html'</span>)</span><br><span class="line"> <span class="keyword">elif</span> request.method == <span class="string">'POST'</span>:</span><br><span class="line"> <span class="comment">#处理计算</span></span><br><span class="line"> x = <span class="built_in">int</span>(request.POST[<span class="string">'x'</span>])</span><br><span class="line"> y = <span class="built_in">int</span>(request.POST[<span class="string">'y'</span>])</span><br><span class="line"> op = request.POST[<span class="string">'op'</span>]</span><br><span class="line"></span><br><span class="line"> result = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> op == <span class="string">'add'</span>:</span><br><span class="line"> result = x + y</span><br><span class="line"> <span class="keyword">elif</span> op == <span class="string">'sub'</span>:</span><br><span class="line"> result = x - y</span><br><span class="line"> <span class="keyword">elif</span> op == <span class="string">'mul'</span>:</span><br><span class="line"> result = x * y</span><br><span class="line"> <span class="keyword">elif</span> op == <span class="string">'div'</span>:</span><br><span class="line"> result = x / y</span><br><span class="line"></span><br><span class="line"> <span class="comment">#dic={'x':x, 'y':y, 'op':op}</span></span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'mycal.html'</span>, <span class="built_in">locals</span>())<span class="comment"># locals方法-局部变量直接封装成字典(Python自带方法)</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/mycal.html</span></span><br><span class="line"><form action=<span class="string">'/mycal'</span> method=<span class="string">'post'</span>></span><br><span class="line"> <<span class="built_in">input</span> <span class="built_in">type</span>=<span class="string">'text'</span> name=<span class="string">"x"</span> value=<span class="string">"{{ x }}"</span>></span><br><span class="line"> <select name=<span class="string">'op'</span>></span><br><span class="line"> <option value=<span class="string">"add"</span> {% <span class="keyword">if</span> op == <span class="string">'add'</span> %}selected{% endif %} > +加</option><span class="comment"># ☆ 记录op状态,option selected属性,使用了if标签</span></span><br><span class="line"> <option value=<span class="string">"sub"</span> {% <span class="keyword">if</span> op == <span class="string">'sub'</span> %}selected{% endif %}> -减</option></span><br><span class="line"> <option value=<span class="string">"mul"</span> {% <span class="keyword">if</span> op == <span class="string">'mul'</span> %}selected{% endif %}> *乘</option></span><br><span class="line"> <option value=<span class="string">"div"</span> {% <span class="keyword">if</span> op == <span class="string">'div'</span> %}selected{% endif %}> /除</option></span><br><span class="line"> </select></span><br><span class="line"> <<span class="built_in">input</span> <span class="built_in">type</span>=<span class="string">'text'</span> name=<span class="string">"y"</span> value=<span class="string">"{{ y }}"</span>> = <span>{{ result }}</span></span><br><span class="line"> <div><<span class="built_in">input</span> <span class="built_in">type</span>=<span class="string">"submit"</span> value=<span class="string">'开始计算'</span>></div></span><br><span class="line"></form></span><br><span class="line"></span><br></pre></td></tr></table></figure></li></ul><h4 id="for标签">for标签<a class="header-anchor" href="#for标签"></a></h4><ul class="lvl-0"><li class="lvl-2"><p><strong>语法:</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">{% for 变量 in 可迭代对象 %}</span><br><span class="line"> ... 循环语句</span><br><span class="line">{% empty %}</span><br><span class="line"> ... 可迭代对象无数据时填充的语句</span><br><span class="line">{% endfor %}</span><br></pre></td></tr></table></figure><p>官方文档:<a href="https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/#for">https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/#for</a></p></li><li class="lvl-2"><p><strong>内置变量 - forloop</strong></p></li></ul><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160246199.png" alt=""></p><ul class="lvl-0"><li class="lvl-2"><p><strong>演示:</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test_if_for</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160254425.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'test_if_for'</span>, views.test_if_for),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_if_for</span>(<span class="params">request</span>):</span><br><span class="line"> dic = {}</span><br><span class="line"> dic[<span class="string">'lst'</span>] = [<span class="string">'Tom'</span>, <span class="string">'Jack'</span>, <span class="string">'Lily'</span>]</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'test_if_for.html'</span>, dic)</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/test_if_for.html</span></span><br><span class="line">{% <span class="keyword">for</span> name <span class="keyword">in</span> lst %}</span><br><span class="line"> {% <span class="keyword">if</span> forloop.first %} &&&&& {% endif %}</span><br><span class="line"> <p> {{ forloop.counter }} {{ name }}</p></span><br><span class="line"> {% <span class="keyword">if</span> forloop.last %} ===== {% endif %}</span><br><span class="line">{% empty %}</span><br><span class="line"> 当前没数据</span><br><span class="line">{% endfor %}</span><br></pre></td></tr></table></figure><h3 id="小节">小节<a class="header-anchor" href="#小节"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>变量调用 - 点大法</p></li><li class="lvl-2"><p>标签语法 {% 标签 %} {% 结束标签 %}</p></li></ul><hr><h2 id="二-模板层-过滤器和继承">二. 模板层 - 过滤器和继承<a class="header-anchor" href="#二-模板层-过滤器和继承"></a></h2><h3 id="过滤器">过滤器<a class="header-anchor" href="#过滤器"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>定义:在变量输出时对变量的值进行处理</p></li><li class="lvl-2"><p>作用:可以通过使用 过滤器 来改变变量的输出显示</p></li><li class="lvl-2"><p>语法:**{{ 变量 | 过滤器1:'参数1' | 过滤器2:'参数2' ... }}**</p></li></ul><p>官方文档:<a href="https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/">https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/</a></p><ul class="lvl-0"><li class="lvl-2"><p><strong>常用过滤器:</strong></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160307400.png" alt=""></p></li><li class="lvl-2"><p>演示:</p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test_html_param</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160312462.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160313992.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'test_html'</span>, views.test_html)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_html_param</span>(<span class="params">request</span>):</span><br><span class="line"> dic = {}</span><br><span class="line"> dic[<span class="string">'int'</span>] = <span class="number">88</span></span><br><span class="line"> dic[<span class="string">'script'</span>] = <span class="string">'<script>alert(1111)</script>'</span></span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'test_html_param.html'</span>, dic)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">say_hi</span>():</span><br><span class="line"> <span class="keyword">return</span> <span class="string">'hahaha'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Dog</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">say</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="keyword">return</span> <span class="string">'wangwang'</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/test_html_param.html</span></span><br><span class="line"><h3><span class="built_in">int</span> 是 {{ <span class="built_in">int</span>|add:<span class="string">"2"</span> }}</h3></span><br><span class="line"><h3><span class="built_in">str</span> 是 {{ <span class="built_in">str</span>|upper }}</h3></span><br><span class="line"><h3>script 是 {{ script|safe }}</h3></span><br></pre></td></tr></table></figure><h3 id="继承">继承<a class="header-anchor" href="#继承"></a></h3><p><strong>模板的继承</strong></p><p>如下样例:</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160321750.png" alt=""></p><ul class="lvl-0"><li class="lvl-2"><p>模板继承可以使父模板的内容重用,子模板直接继承父模板的全部内容并可以覆盖父模板中相应的块</p></li><li class="lvl-2"><p>语法 - 父模板中:</p><ul class="lvl-2"><li class="lvl-4"><input type="checkbox" id="checkbox0" checked="true"><label for="checkbox0">定义父模板中的**块 block **标签</label></li><li class="lvl-4"><input type="checkbox" id="checkbox1" checked="true"><label for="checkbox1">表时出哪些在</label><strong>子模块</strong>中是允许被<strong>修改</strong>的</li><li class="lvl-4"><input type="checkbox" id="checkbox2" checked="true"><label for="checkbox2">block 标签:</label><strong>在父模板中定义,可以在子模板中覆盖</strong></li></ul></li><li class="lvl-2"><p>语法 - 子模板中:</p><ul class="lvl-2"><li class="lvl-4"><p><input type="checkbox" id="checkbox3" checked="true"><label for="checkbox3">继承模板 </label><code>extends</code> 标签(写在模板文件的第一行)</p><p>例如 <code>{% extends 'base.html' %}</code></p></li><li class="lvl-4"><p><input type="checkbox" id="checkbox4" checked="true"><label for="checkbox4">子模板 重写父模板中的内容块</label></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{% block block_name %}</span><br><span class="line">子模板块用来覆盖父模板中 block_name 块的内容</span><br><span class="line">{% endblock block_name %}- block_name 可写可不写</span><br></pre></td></tr></table></figure></li></ul></li><li class="lvl-2"><p>重写的覆盖规则</p><ul class="lvl-2"><li class="lvl-4"><input type="checkbox" id="checkbox5" checked="true"><label for="checkbox5">不重写,将按照父模板中的效果显示</label></li><li class="lvl-4"><input type="checkbox" id="checkbox6" checked="true"><label for="checkbox6">重写,则按照重写效果显示</label></li></ul></li><li class="lvl-2"><p>注意</p><ul class="lvl-2"><li class="lvl-4"><input type="checkbox" id="checkbox7" checked="true"><label for="checkbox7">模板继承时,服务器端的动态内容无法继承</label></li></ul></li><li class="lvl-2"><p><strong>演示:</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/base_index</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161504056.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161504615.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'base_index'</span>, views.base_view, name=<span class="string">'base_index'</span>),</span><br><span class="line"> path(<span class="string">'music_index'</span>, views.music_view),</span><br><span class="line"> path(<span class="string">'sport_index'</span>, views.sport_view),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">base_view</span>(<span class="params">request</span>):</span><br><span class="line"> lst = [<span class="string">'Tom'</span>, <span class="string">'Jack'</span>]</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'base.html'</span>, <span class="built_in">locals</span>())</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">music_view</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'music.html'</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sport_view</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'sport.html'</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># mysite1/templates/base.html# 父模板</span></span><br><span class="line"><!DOCTYPE html></span><br><span class="line"><html lang=<span class="string">"en"</span>></span><br><span class="line"><head></span><br><span class="line"> <meta charset=<span class="string">"UTF-8"</span>></span><br><span class="line"> {% block mytitle %}</span><br><span class="line"> <title>主页</title><span class="comment"># 子模板能改的地方</span></span><br><span class="line"> {% endblock %}</span><br><span class="line"></head></span><br><span class="line"><body></span><br><span class="line">{{ lst }}<span class="comment"># 子模板无法继承变量(动态内容)</span></span><br><span class="line"><a href=<span class="string">"/music_index"</span>>音乐频道</a><span class="comment"># 子模板不能改</span></span><br><span class="line"><a href=<span class="string">"/sport_index"</span>>体育频道</a></span><br><span class="line"><br></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">{% block info %}</span><br><span class="line"> 这是主页<span class="comment"># 子模板能改的地方</span></span><br><span class="line">{% endblock %}</span><br><span class="line"></span><br><span class="line"><br></span><br><span class="line"></span><br><span class="line"><h3>有任何问题联系xxxx</h3><span class="comment"># 子模板不能改</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/music.html# 子模板</span></span><br><span class="line">{% extends <span class="string">'base.html'</span> %}<span class="comment"># 继承父模板</span></span><br><span class="line"></span><br><span class="line">{% block mytitle %}</span><br><span class="line"> <title>音乐频道</title><span class="comment"># 子模板重写block</span></span><br><span class="line">{% endblock %}</span><br><span class="line"></span><br><span class="line">{% block info %}</span><br><span class="line"> 欢迎来到音乐频道</span><br><span class="line">{% endblock %}</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/sport.html</span></span><br><span class="line">{% extends <span class="string">'base.html'</span> %}</span><br><span class="line"></span><br><span class="line">{% block mytitle %}</span><br><span class="line"> <title>体育频道</title></span><br><span class="line">{% endblock %}</span><br><span class="line"></span><br><span class="line">{% block info %}</span><br><span class="line"> 欢迎来到体育频道</span><br><span class="line">{% endblock %}</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="小节-2">小节<a class="header-anchor" href="#小节-2"></a></h3><ul class="lvl-0"><li class="lvl-2"><p><strong>过滤器</strong></p><p>{ <code>变量</code> | <code>过滤器</code>1:‘<code>参数值</code>1’ | 过滤器2:‘参数值2’ … }</p></li><li class="lvl-2"><p><strong>模板的继承</strong></p><p>父模板 - <code>定义可被修改的block</code></p><p>子模板 - 继承<code>父模板</code>;按需修改<code>父模板中定义的block</code></p></li></ul><hr><h2 id="三-url反向解析">三. url反向解析<a class="header-anchor" href="#三-url反向解析"></a></h2><ul class="lvl-0"><li class="lvl-2"><p><strong>代码中 url 出现位置</strong></p><ol><li class="lvl-5"><p><mark>模板</mark> 【html中】</p><ol><li class="lvl-8"><p><a <mark>href</mark>=‘url’>超链接</a></p><p>点击后 页面跳转至 url</p></li><li class="lvl-8"><p><form <mark>action</mark>=‘url’ method=‘post’></p><p>form表单中的数据 用post方法提交至 url</p></li></ol></li><li class="lvl-5"><p><mark>视图函数</mark>中 - 302跳转 HttpResponseRedirect(‘url’)</p><p>将用户地址栏中的地址跳转到 url</p></li></ol></li><li class="lvl-2"><p><strong>代码中 url 书写规范</strong></p><ol><li class="lvl-5"><p><mark>绝对地址</mark></p><p><a href="http://127.0.0.1:8000/page/1">http://127.0.0.1:8000/page/1</a></p></li><li class="lvl-5"><p><mark>相对地址</mark></p><ol><li class="lvl-8">‘==/==page/1’ -<mark>‘/’ 开头的相对地址</mark>,浏览器会把当前地址栏里的 协议,ip 和 端口 加上这个地址,作为最终访问地址,即如果当前页面地址栏为 <a href="http://127.0.0.1:8000/page/3%EF%BC%9B%E5%BD%93%E5%89%8D%E7%9B%B8%E5%AF%B9%E5%9C%B0%E5%9D%80%E6%9C%80%E7%BB%88%E7%BB%93%E6%9E%9C%E4%B8%BA">http://127.0.0.1:8000/page/3;当前相对地址最终结果为</a> <mark><code>http://127.0.0.1:8000</code></mark> + /page/1(☆ 高频使用)</li><li class="lvl-8">‘page/1’ -<mark>没有 ‘/’ 开头的相对地址</mark>,浏览器会根据<code>当前 url 的最后一个 / 之前的内容 加上 该相对地址</code> 作为最终访问地址,例如当前地址栏地址为 ==<a href="http://127.0.0.1:8000/topic/==detail%EF%BC%9B%E5%88%99%E8%AF%A5%E7%9B%B8%E5%AF%B9%E5%9C%B0%E5%9D%80%E6%9C%80%E7%BB%88%E7%BB%93%E6%9E%9C%E4%B8%BA">http://127.0.0.1:8000/topic/==detail;则该相对地址最终结果为</a> <mark><code>http://127.0.0.1:8000/topic/</code></mark> + page/1</li></ol></li></ol></li><li class="lvl-2"><p><strong>演示:</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test/url</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161656031.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161657095.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161702913.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> <span class="comment"># http://127.0.0.1:8000/test/url</span></span><br><span class="line"> path(<span class="string">'test/url'</span>, views.test_url),</span><br><span class="line"> path(<span class="string">'test_url_result'</span>, views.test_url_result)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_url</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'test_url.html'</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_url_result</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">return</span> HttpResponse(<span class="string">'---test url res is ok'</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/test_url.html</span></span><br><span class="line"><a href=<span class="string">"http://127.0.0.1:8000/test_url_result"</span>>绝对地址</a></span><br><span class="line"><a href=<span class="string">"/test_url_result"</span>>带<span class="string">'/'</span>的相对地址</a></span><br><span class="line"><a href=<span class="string">"test_url_result"</span>>不带<span class="string">'/'</span>的相对地址</a><span class="comment"># 浏览器解析为 http://127.0.0.1:8000/test/test_url_result</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><strong>url 反向解析</strong></p><ul class="lvl-2"><li class="lvl-4"><p>url 反向解析是指在视图或者模板中,用 <mark>path 定义的名称</mark>来<mark>动态查找或计算出相应的路由</mark></p></li><li class="lvl-4"><p><strong>path 函数的语法</strong></p><ul class="lvl-4"><li class="lvl-6"><input type="checkbox" id="checkbox8" checked="true"><label for="checkbox8">path(route, views, </label><mark>name</mark>=“别名”)</li><li class="lvl-6"><input type="checkbox" id="checkbox9" checked="true"><label for="checkbox9">path(‘page’, views.page_view, name=“page_url”)</label></li><li class="lvl-6">根据 path 中的 ‘name=’ 关键字传给 url 确定了个唯一确定的名字,在模板或视图中,可以通过这个名字反向推断出此 url 信息</li></ul></li><li class="lvl-4"><p><mark>模板中</mark> - 通过 url 标签实现地址的反向解析</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">{% url '别名' %}</span><br><span class="line">{% url '别名' '参数值1' '参数值2' %}</span><br><span class="line">ex:</span><br><span class="line">{% url 'pagen' '400' %}--- 传参一律是 str</span><br><span class="line">{% url 'person' age='18' name='gxn' %}</span><br></pre></td></tr></table></figure><ul class="lvl-4"><li class="lvl-6"><p><strong>演示:在模板中使用</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test/url</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161725987.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> <span class="comment"># http://127.0.0.1:8000/test/url</span></span><br><span class="line"> path(<span class="string">'test/url'</span>, views.test_url),</span><br><span class="line"> path(<span class="string">'test_urls_result/<int:age>'</span>, views.test_url_result, name=<span class="string">'tr'</span>)<span class="comment"># 起别名 tr</span></span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_url</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'test_url.html'</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_urls_result</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">return</span> HttpResponse(<span class="string">'---test url res is ok'</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/test_url.html</span></span><br><span class="line"><a href=<span class="string">"{% url 'tr' '100' %}"</span>>url反向解析版本</a><span class="comment"># ☆ 模板中使用别名</span></span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li class="lvl-4"><p>在<mark>视图函数</mark>中 → 可调用 django 中的 <mark>reverse</mark> 方法进行反向解析</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> django.urls <span class="keyword">import</span> reverse</span><br><span class="line">reverse(<span class="string">'别名'</span>, args=[], kwargs={})</span><br><span class="line">ex:</span><br><span class="line"><span class="built_in">print</span>(reverse(<span class="string">'pagen'</span>, args=[<span class="number">300</span>]))</span><br><span class="line"><span class="built_in">print</span>(reverse(<span class="string">'person'</span>, kwargs=</span><br><span class="line">{<span class="string">'name'</span>:<span class="string">'peng'</span>, <span class="string">'age'</span>:<span class="number">23</span>}))</span><br><span class="line"></span><br></pre></td></tr></table></figure><ul class="lvl-4"><li class="lvl-6"><p>演示:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test/url</span><br><span class="line"></span><br><span class="line"># 302跳转 - 响应头里的 location 标记跳转地址</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161742771.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161745717.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'base_index'</span>, views.base_view, name=<span class="string">'base_index'</span>),<span class="comment"># 起别名 base_index</span></span><br><span class="line"> <span class="comment"># http://127.0.0.1:8000/test/url</span></span><br><span class="line"> path(<span class="string">'test/url'</span>, views.test_url),</span><br><span class="line"> path(<span class="string">'test_urls_result/<int:age>'</span>, views.test_url_result, name=<span class="string">'tr'</span>)<span class="comment"># 起别名 tr</span></span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">base_view</span>(<span class="params">request</span>):</span><br><span class="line"> lst = [<span class="string">'Tom'</span>, <span class="string">'Jack'</span>]</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'base.html'</span>, <span class="built_in">locals</span>())</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_url</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'test_url.html'</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_url_result</span>(<span class="params">request, age</span>):</span><br><span class="line"> <span class="comment">#302跳转</span></span><br><span class="line"> <span class="keyword">from</span> django.urls <span class="keyword">import</span> reverse</span><br><span class="line"> url = reverse(<span class="string">'base_index'</span>)<span class="comment"># ☆ 视图函数中使用别名</span></span><br><span class="line"> <span class="keyword">return</span> HttpResponseRedirect(url)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#---------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># mysite1/templates/test_url.html</span></span><br><span class="line"><a href=<span class="string">"{% url 'tr' '100' %}"</span>>url反向解析版本</a></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/base.html</span></span><br><span class="line">略</span><br><span class="line"></span><br></pre></td></tr></table></figure></li></ul></li></ul></li></ul><h2 id="四-总结">四. 总结<a class="header-anchor" href="#四-总结"></a></h2><ul class="lvl-0"><li class="lvl-2"><p>请求(request)和响应(HttpResponseqing)</p></li><li class="lvl-2"><p>GET/POST处理 - request.GET/POST</p></li><li class="lvl-2"><p>MVC 和 MTV</p></li><li class="lvl-2"><p>模板层基础配置</p></li><li class="lvl-2"><p>模板变量/标签/过滤器/继承</p></li><li class="lvl-2"><p>url反向解析</p></li></ul><hr>]]></content>
|
|
1346
1346
|
|
|
1347
1347
|
|
|
1348
1348
|
<categories>
|
|
@@ -1369,7 +1369,7 @@
|
|
|
1369
1369
|
<link href="/posts/42935.html"/>
|
|
1370
1370
|
<url>/posts/42935.html</url>
|
|
1371
1371
|
|
|
1372
|
-
<content type="html"><![CDATA[<p><a href="https://www.bilibili.com/video/BV1vK4y1o7jH">视频链接:https://www.bilibili.com/video/BV1vK4y1o7jH</a></p><h2 id="一-GET请求和POST请求">一. GET请求和POST请求<a class="header-anchor" href="#一-GET请求和POST请求"></a></h2><h3 id="定义">定义<a class="header-anchor" href="#定义"></a></h3><blockquote><p>·无论是GET还是POST,统一都由<code>视图函数</code>接收请求,通过判断request.method区分具体的请求动作</p><p>·样例:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> requests.method == <span class="string">'GET'</span>:</span><br><span class="line"> 处理GET请求时的业务逻辑</span><br><span class="line"><span class="keyword">elif</span> requests.method == <span class="string">'POST'</span>:</span><br><span class="line"> 处理POST请求的业务逻辑</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> 其他请求业务逻辑</span><br></pre></td></tr></table></figure><p>------------------------------------------------------------------</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">演示</span><br><span class="line"></span><br><span class="line"> <项目同名文件夹下>/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_get_post</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">if</span> request.method == <span class="string">'GET'</span>:</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"> <span class="keyword">elif</span> request.method == <span class="string">'POST'</span>:</span><br><span class="line"> <span class="comment">#处理用户提交数据</span></span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"> <span class="keyword">return</span> HttpResponse(<span class="string">'--test get post is ok--'</span>)</span><br></pre></td></tr></table></figure></blockquote><h3 id="GET处理">GET处理<a class="header-anchor" href="#GET处理"></a></h3><blockquote><p>·GET请求动作,一般用于向服务器<code>获取数据</code></p><p>·能够产生GET请求的场景:</p><p>- 浏览器地址栏中输入URL,回车后</p><p>- <<code>a href</code>=“地址?参数=值&参数=值”></p><p>- <code>form表单</code>中的<code>method为get</code></p><p>------------------------------------------------------------------</p><p>GET请求方式中,如果有数据需要传递给服务器,通常会用<code>查询字符串(Query String)</code>传递【注意:<code>不要传递敏感数据</code>】</p><p>URL格式:xxx<code>?参数名1=值1&参数名2=值2...</code></p><p>- 如:<a href="http://127.0.0.1:8000/page1%60?a=100&b=200%60">http://127.0.0.1:8000/page1`?a=100&b=200`</a></p><p>服务器端接收参数</p><p>获取客户端请求GET请求提交的数据</p><p>·方法示例:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">request.GET[<span class="string">'参数名'</span>] <span class="comment"># QueryDict</span></span><br><span class="line">request.GET.get(<span class="string">'参数名'</span>, <span class="string">'默认值'</span>)</span><br><span class="line">request.GET.getlist(<span class="string">'参数名'</span>)</span><br><span class="line"><span class="comment"># mypage?a=100&b=200&c=300&b=400</span></span><br><span class="line"><span class="comment"># request.GET=QueryDict({'a': ['100'], 'b': ['200', '400'], 'c': ['300']})</span></span><br><span class="line"><span class="comment"># a = request.GET['a']</span></span><br><span class="line"><span class="comment"># b = request.GET['b'] # Error</span></span><br></pre></td></tr></table></figure><p>------------------------------------------------------------------</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">演示</span><br><span class="line"></span><br><span class="line">http://<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">8000</span>/test_get_post?a=<span class="number">400</span></span><br><span class="line">--test get post <span class="keyword">is</span> ok--</span><br><span class="line">终端</span><br><span class="line"><QueryDict: {<span class="string">'a'</span>: [<span class="string">'400'</span>, <span class="string">'200'</span>, <span class="string">'100'</span>]}></span><br><span class="line"><span class="number">100</span></span><br><span class="line">[<span class="string">'400'</span>, <span class="string">'200'</span>, <span class="string">'100'</span>]</span><br><span class="line">no c</span><br><span class="line"></span><br><span class="line"> <项目同名文件夹下>/urls.py</span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'test_get_post'</span>, views.test_get_post)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> <项目同名文件夹下>/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_get_post</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">if</span> request.method == <span class="string">'GET'</span>:</span><br><span class="line"> <span class="built_in">print</span>(request.GET)</span><br><span class="line"> <span class="built_in">print</span>(request.GET[<span class="string">'a'</span>])</span><br><span class="line"> <span class="comment"># 问卷调查 = form get 兴趣爱好 - 复选框</span></span><br><span class="line"> <span class="built_in">print</span>(request.GET.getlist(<span class="string">'a'</span>))</span><br><span class="line"> <span class="built_in">print</span>(request.GET.get(<span class="string">'c'</span>, <span class="string">'no c'</span>))</span><br><span class="line"> <span class="keyword">elif</span> request.method == <span class="string">'POST'</span>:</span><br><span class="line"> <span class="comment">#处理用户提交数据</span></span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"> <span class="keyword">return</span> HttpResponse(<span class="string">'--test get post is ok--'</span>)</span><br></pre></td></tr></table></figure><p>------------------------------------------------------------------</p><p>·思考:之前的计算器功能,能否拿查询字符串做?</p><p><a href="http://127.0.0.1:8000/%E6%95%B4%E6%95%B0/%E6%93%8D%E4%BD%9C%E7%AC%A6/%E6%95%B4%E6%95%B0">http://127.0.0.1:8000/整数/操作符/整数</a></p><p><a href="http://127.0.0.1:8000/cal?x=10&y=20&op=add">http://127.0.0.1:8000/cal?x=10&y=20&op=add</a></p></blockquote><h3 id="POST处理">POST处理<a class="header-anchor" href="#POST处理"></a></h3><blockquote><p>·POST请求动作,一般用于<code>向服务器提交大量/隐私数据</code></p><p>·客户端通过表单等POST请求将数据传递给服务器端,如:</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052323569.png" alt=""></p><p>·服务器端<code>接收参数</code></p><p>通过request.method来判断是否为POST请求,如:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> request.method == <span class="string">'POST'</span>:</span><br><span class="line"> 处理POST请求的数据并响应</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> 处理非POST请求的响应</span><br></pre></td></tr></table></figure><p>------------------------------------------------------------------</p><p><strong>使用post方式接收客户端数据</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">request.POST[<span class="string">'参数名'</span>] <span class="comment"># request.POST 绑定QueryDict</span></span><br><span class="line">request.POST.get(<span class="string">'参数名'</span>, <span class="string">''</span>)</span><br><span class="line">request.POST.getlist(<span class="string">'参数名'</span>)</span><br></pre></td></tr></table></figure><p><strong><code>取消csrf验证,否则Django将会拒绝客户端发来的POST请求,报403响应</code></strong></p><p>------------------------------------------------------------------</p><p><strong>取消csrf验证</strong></p><p>- 禁止掉settings.py中MIDDLEWARE中的CsrfviewsMiddleWare的中间件</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">MIDDLEWARE = [</span><br><span class="line">...</span><br><span class="line"> <span class="comment"># 'django.middleware.csrf.CsrfViewMiddleware',</span></span><br><span class="line"> ...</span><br><span class="line">]</span><br></pre></td></tr></table></figure><p>------------------------------------------------------------------</p><p>演示</p><p><a href="http://127.0.0.1:8000/test_get_post">http://127.0.0.1:8000/test_get_post</a></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052336498.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">post <span class="keyword">is</span> ok</span><br><span class="line">终端</span><br><span class="line">uname <span class="keyword">is</span> cpen</span><br><span class="line"></span><br><span class="line"> <项目同名文件夹下>/urls.py</span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'test_get_post'</span>, views.test_get_post)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> <项目同名文件夹下>/views.py</span><br><span class="line">POST_FORM = <span class="string">'''</span></span><br><span class="line"><span class="string"><form method='post' action='/test_get_post'></span></span><br><span class="line"><span class="string"> 用户名: <input type='text' name='uname'></span></span><br><span class="line"><span class="string"> <input type='submit' value='提交'></span></span><br><span class="line"><span class="string"></form></span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_get_post</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">if</span> request.method == <span class="string">'GET'</span>:</span><br><span class="line"> <span class="keyword">return</span> HttpResponse(POST_FORM)</span><br><span class="line"> ...</span><br></pre></td></tr></table></figure><p>---------------------------------------------------------------------------------------------------------------------------------</p><p>小节</p><p>·Django处理GET请求</p><p>查询字符串 - 少量数据传递</p><p>·Django处理POST请求</p><p>专用于浏览器提交数据</p></blockquote><hr><h2 id="二-Django的设计模式及模板层">二. Django的设计模式及模板层<a class="header-anchor" href="#二-Django的设计模式及模板层"></a></h2><h3 id="MVC和MTV">MVC和MTV<a class="header-anchor" href="#MVC和MTV"></a></h3><h4 id="传统的MVC">传统的MVC<a class="header-anchor" href="#传统的MVC"></a></h4><blockquote><p>MVC代表<code>Model-View-Controller</code>(模型-视图-控制器)模式。</p><ul class="lvl-1"><li class="lvl-2"><p><input type="checkbox" id="checkbox0" checked="true"><label for="checkbox0"></label><code>M模型层(Model)</code>,主要用于对数据库层的封装</p></li><li class="lvl-2"><p><input type="checkbox" id="checkbox1" checked="true"><label for="checkbox1"></label><code>V视图层(View)</code>,用于向用户展示结果(WHAT + HOW)</p></li><li class="lvl-2"><p><input type="checkbox" id="checkbox2" checked="true"><label for="checkbox2"></label><code>C控制(Controller)</code>,用于处理请求、获取数据、返回结果(重要)</p></li></ul><p>作用:<code>降低模块间的耦合度(解耦)</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052338248.png" alt=""></p></blockquote><h4 id="Django的MTV模式">Django的MTV模式<a class="header-anchor" href="#Django的MTV模式"></a></h4><blockquote><p>MTV代表<code>Model-Template-View</code>(模型-模板-视图)模式。</p><ul class="lvl-1"><li class="lvl-2"><p><input type="checkbox" id="checkbox3" checked="true"><label for="checkbox3"></label><code>M模型层(Model)</code>负责与数据库交互</p></li><li class="lvl-2"><p><input type="checkbox" id="checkbox4" checked="true"><label for="checkbox4"></label><code>T模板层(Template)</code>负责呈现内容到浏览器(HOW)</p></li><li class="lvl-2"><p><input type="checkbox" id="checkbox5" checked="true"><label for="checkbox5"></label><code>V视图层(View)</code>是核心,负责接收请求、获取数据、返回结果(WHAT)</p></li></ul><p>作用:<code>降低模块间的耦合度(解耦)</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052340887.png" alt=""></p><p>---------------------------------------------------------------------------------------------------------------------------------</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052341004.jpg" alt=""></p></blockquote><h3 id="模板层">模板层<a class="header-anchor" href="#模板层"></a></h3><h4 id="什么是模板">什么是模板<a class="header-anchor" href="#什么是模板"></a></h4><blockquote><p>1、模板是可以根据<code>字典</code>数据动态变化的<code>html网页</code></p><p>2、模板可以<code>根据视图中传递的字典数据动态生成相应的HTML网页</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052342133.png" alt=""></p></blockquote><h4 id="模板配置">模板配置<a class="header-anchor" href="#模板配置"></a></h4><blockquote><p>创建模板文件夹 <code><项目名>/templates</code></p><p>在<code>settings.py</code>中<code>TEMPLATES</code>配置项</p><p>1.BACKEND:指定模板的引擎</p><p>2.<code>DIRS</code>:模板的搜索目录(可以是一个或多个)</p><p>3.APP_DIRS:是否要在应用中的templates文件夹中搜索模板文件</p><p>4.OPTIONS:有关模板的选项</p><p>·配置项中 需要修改部分</p><p>设置DIRS - <code>'DIRS': [os.path.join(BASE_DIR, 'templates')],</code></p><p>------------------------------------------------------------------</p><p>演示</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"> <项目同名文件夹下>/settings.py</span><br><span class="line">TEMPLATES = [</span><br><span class="line"> {</span><br><span class="line"> ...</span><br><span class="line"> <span class="string">'DIRS'</span>: [os.path.join(BASE_DIR, <span class="string">'templates'</span>)],</span><br><span class="line"> ...</span><br></pre></td></tr></table></figure></blockquote><h4 id="模板的加载方式">模板的加载方式<a class="header-anchor" href="#模板的加载方式"></a></h4><blockquote><p><strong>方案1</strong> - 通过loader获取模板,通过HttpResponse进行响应(特点:麻烦)</p><p>在视图函数中:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> django.template <span class="keyword">import</span> loader</span><br><span class="line"><span class="comment"># 1.通过 loader 加载模板</span></span><br><span class="line">t = loader.get_template(<span class="string">"模板文件名"</span>)</span><br><span class="line"><span class="comment"># 2.将 t 转换成 HTML 字符串</span></span><br><span class="line">html = t.reader(字典数据)</span><br><span class="line"><span class="comment"># 3.用响应对象将转换的字符串内容返回给浏览器</span></span><br><span class="line"><span class="keyword">return</span> HttpResponse(html)</span><br></pre></td></tr></table></figure><p>--------------------------------------------------------------------------------------</p><p><strong>演示</strong></p><p><a href="http://127.0.0.1:8000/test_html">http://127.0.0.1:8000/test_html</a></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052345270.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"> <项目同名文件夹下>/urls.py</span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'test_html'</span>, views.test_html)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> <项目同名文件夹下>/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_html</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">from</span> django.template <span class="keyword">import</span> loader</span><br><span class="line"> t = loader.get_template(<span class="string">'test_html.html'</span>)</span><br><span class="line"> html = t.render()</span><br><span class="line"> <span class="keyword">return</span> HttpResponse(html)</span><br><span class="line"></span><br><span class="line"> <项目文件夹下>/templates/test_html.html</span><br><span class="line"><h3>我是模板层的~~~~</h3></span><br></pre></td></tr></table></figure><p>---------------------------------------------------------------------------------------------------------------------------------</p><p><strong>方案2</strong> - 通过render() 直接加载并响应模板(特点:方便,大量使用这种)</p><p>在视图函数中:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> django.shortcuts <span class="keyword">import</span> render</span><br><span class="line"><span class="keyword">return</span> render(request, <span class="string">'模板文件名'</span>, 字典数据)</span><br></pre></td></tr></table></figure><p>--------------------------------------------------------------------------------------</p><p><strong>演示</strong></p><p><a href="http://127.0.0.1:8000/test_html">http://127.0.0.1:8000/test_html</a></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052346308.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"> <项目同名文件夹下>/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_html</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="comment"># 方案2</span></span><br><span class="line"> <span class="keyword">from</span> django.shortcuts <span class="keyword">import</span> render</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'test_html.html'</span>)</span><br></pre></td></tr></table></figure></blockquote><h4 id="视图层与模板层之间的交互">视图层与模板层之间的交互<a class="header-anchor" href="#视图层与模板层之间的交互"></a></h4><blockquote><p>1、视图函数中可以将Python<code>变量</code>封装到字典中传递到模板</p><p>样例:</p><p>def xxx_view(request):<br>dic = {<br>“变量1”: “值1”,<br>“变量2”: “值2”,<br>}<br>return render(request, ‘xxx.html’, <code>dic</code>)</p><p>2、模板中,我们可以用 <strong></strong> 的语法 调用视图传进来的变量</p><p>--------------------------------------------------------------------------------------</p><p><strong>演示</strong></p><p><a href="http://127.0.0.1:8000/test_html">http://127.0.0.1:8000/test_html</a></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052348278.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"> <项目同名文件夹下>/urls.py</span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'test_html'</span>, views.test_html)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> <项目同名文件夹下>/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_html</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">from</span> django.shortcuts <span class="keyword">import</span> render</span><br><span class="line"> dic = {<span class="string">'username'</span>: <span class="string">'peng'</span>, <span class="string">'age'</span>: <span class="number">23</span>}</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'test_html.html'</span>, dic)</span><br><span class="line"></span><br><span class="line"> <项目文件夹下>/templates/test_html.html</span><br><span class="line"><h3>{{ username }}是模板层的~~~~</h3></span><br></pre></td></tr></table></figure></blockquote><hr>]]></content>
|
|
1372
|
+
<content type="html"><![CDATA[<p><a href="https://www.bilibili.com/video/BV1vK4y1o7jH">视频链接:https://www.bilibili.com/video/BV1vK4y1o7jH</a></p><h2 id="一-GET请求和POST请求">一. GET请求和POST请求<a class="header-anchor" href="#一-GET请求和POST请求"></a></h2><h3 id="定义">定义<a class="header-anchor" href="#定义"></a></h3><blockquote><p>·无论是GET还是POST,统一都由<code>视图函数</code>接收请求,通过判断request.method区分具体的请求动作</p><p>·样例:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> requests.method == <span class="string">'GET'</span>:</span><br><span class="line"> 处理GET请求时的业务逻辑</span><br><span class="line"><span class="keyword">elif</span> requests.method == <span class="string">'POST'</span>:</span><br><span class="line"> 处理POST请求的业务逻辑</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> 其他请求业务逻辑</span><br></pre></td></tr></table></figure><p>------------------------------------------------------------------</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">演示</span><br><span class="line"></span><br><span class="line"> <项目同名文件夹下>/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_get_post</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">if</span> request.method == <span class="string">'GET'</span>:</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"> <span class="keyword">elif</span> request.method == <span class="string">'POST'</span>:</span><br><span class="line"> <span class="comment">#处理用户提交数据</span></span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"> <span class="keyword">return</span> HttpResponse(<span class="string">'--test get post is ok--'</span>)</span><br></pre></td></tr></table></figure></blockquote><h3 id="GET处理">GET处理<a class="header-anchor" href="#GET处理"></a></h3><blockquote><p>·GET请求动作,一般用于向服务器<code>获取数据</code></p><p>·能够产生GET请求的场景:</p><p>- 浏览器地址栏中输入URL,回车后</p><p>- <<code>a href</code>=“地址?参数=值&参数=值”></p><p>- <code>form表单</code>中的<code>method为get</code></p><p>------------------------------------------------------------------</p><p>GET请求方式中,如果有数据需要传递给服务器,通常会用<code>查询字符串(Query String)</code>传递【注意:<code>不要传递敏感数据</code>】</p><p>URL格式:xxx<code>?参数名1=值1&参数名2=值2...</code></p><p>- 如:<a href="http://127.0.0.1:8000/page1%60?a=100&b=200%60">http://127.0.0.1:8000/page1`?a=100&b=200`</a></p><p>服务器端接收参数</p><p>获取客户端请求GET请求提交的数据</p><p>·方法示例:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">request.GET[<span class="string">'参数名'</span>] <span class="comment"># QueryDict</span></span><br><span class="line">request.GET.get(<span class="string">'参数名'</span>, <span class="string">'默认值'</span>)</span><br><span class="line">request.GET.getlist(<span class="string">'参数名'</span>)</span><br><span class="line"><span class="comment"># mypage?a=100&b=200&c=300&b=400</span></span><br><span class="line"><span class="comment"># request.GET=QueryDict({'a': ['100'], 'b': ['200', '400'], 'c': ['300']})</span></span><br><span class="line"><span class="comment"># a = request.GET['a']</span></span><br><span class="line"><span class="comment"># b = request.GET['b'] # Error</span></span><br></pre></td></tr></table></figure><p>------------------------------------------------------------------</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">演示</span><br><span class="line"></span><br><span class="line">http://<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">8000</span>/test_get_post?a=<span class="number">400</span></span><br><span class="line">--test get post <span class="keyword">is</span> ok--</span><br><span class="line">终端</span><br><span class="line"><QueryDict: {<span class="string">'a'</span>: [<span class="string">'400'</span>, <span class="string">'200'</span>, <span class="string">'100'</span>]}></span><br><span class="line"><span class="number">100</span></span><br><span class="line">[<span class="string">'400'</span>, <span class="string">'200'</span>, <span class="string">'100'</span>]</span><br><span class="line">no c</span><br><span class="line"></span><br><span class="line"> <项目同名文件夹下>/urls.py</span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'test_get_post'</span>, views.test_get_post)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> <项目同名文件夹下>/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_get_post</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">if</span> request.method == <span class="string">'GET'</span>:</span><br><span class="line"> <span class="built_in">print</span>(request.GET)</span><br><span class="line"> <span class="built_in">print</span>(request.GET[<span class="string">'a'</span>])</span><br><span class="line"> <span class="comment"># 问卷调查 = form get 兴趣爱好 - 复选框</span></span><br><span class="line"> <span class="built_in">print</span>(request.GET.getlist(<span class="string">'a'</span>))</span><br><span class="line"> <span class="built_in">print</span>(request.GET.get(<span class="string">'c'</span>, <span class="string">'no c'</span>))</span><br><span class="line"> <span class="keyword">elif</span> request.method == <span class="string">'POST'</span>:</span><br><span class="line"> <span class="comment">#处理用户提交数据</span></span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"> <span class="keyword">return</span> HttpResponse(<span class="string">'--test get post is ok--'</span>)</span><br></pre></td></tr></table></figure><p>------------------------------------------------------------------</p><p>·思考:之前的计算器功能,能否拿查询字符串做?</p><p><a href="http://127.0.0.1:8000/%E6%95%B4%E6%95%B0/%E6%93%8D%E4%BD%9C%E7%AC%A6/%E6%95%B4%E6%95%B0">http://127.0.0.1:8000/整数/操作符/整数</a></p><p><a href="http://127.0.0.1:8000/cal?x=10&y=20&op=add">http://127.0.0.1:8000/cal?x=10&y=20&op=add</a></p></blockquote><h3 id="POST处理">POST处理<a class="header-anchor" href="#POST处理"></a></h3><blockquote><p>·POST请求动作,一般用于<code>向服务器提交大量/隐私数据</code></p><p>·客户端通过表单等POST请求将数据传递给服务器端,如:</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052323569.png" alt=""></p><p>·服务器端<code>接收参数</code></p><p>通过request.method来判断是否为POST请求,如:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> request.method == <span class="string">'POST'</span>:</span><br><span class="line"> 处理POST请求的数据并响应</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> 处理非POST请求的响应</span><br></pre></td></tr></table></figure><p>------------------------------------------------------------------</p><p><strong>使用post方式接收客户端数据</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">request.POST[<span class="string">'参数名'</span>] <span class="comment"># request.POST 绑定QueryDict</span></span><br><span class="line">request.POST.get(<span class="string">'参数名'</span>, <span class="string">''</span>)</span><br><span class="line">request.POST.getlist(<span class="string">'参数名'</span>)</span><br></pre></td></tr></table></figure><p><strong><code>取消csrf验证,否则Django将会拒绝客户端发来的POST请求,报403响应</code></strong></p><p>------------------------------------------------------------------</p><p><strong>取消csrf验证</strong></p><p>- 禁止掉settings.py中MIDDLEWARE中的CsrfviewsMiddleWare的中间件</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">MIDDLEWARE = [</span><br><span class="line">...</span><br><span class="line"> <span class="comment"># 'django.middleware.csrf.CsrfViewMiddleware',</span></span><br><span class="line"> ...</span><br><span class="line">]</span><br></pre></td></tr></table></figure><p>------------------------------------------------------------------</p><p>演示</p><p><a href="http://127.0.0.1:8000/test_get_post">http://127.0.0.1:8000/test_get_post</a></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052336498.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">post <span class="keyword">is</span> ok</span><br><span class="line">终端</span><br><span class="line">uname <span class="keyword">is</span> cpen</span><br><span class="line"></span><br><span class="line"> <项目同名文件夹下>/urls.py</span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'test_get_post'</span>, views.test_get_post)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> <项目同名文件夹下>/views.py</span><br><span class="line">POST_FORM = <span class="string">'''</span></span><br><span class="line"><span class="string"><form method='post' action='/test_get_post'></span></span><br><span class="line"><span class="string"> 用户名: <input type='text' name='uname'></span></span><br><span class="line"><span class="string"> <input type='submit' value='提交'></span></span><br><span class="line"><span class="string"></form></span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_get_post</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">if</span> request.method == <span class="string">'GET'</span>:</span><br><span class="line"> <span class="keyword">return</span> HttpResponse(POST_FORM)</span><br><span class="line"> ...</span><br></pre></td></tr></table></figure><p>---------------------------------------------------------------------------------------------------------------------------------</p><p>小节</p><p>·Django处理GET请求</p><p>查询字符串 - 少量数据传递</p><p>·Django处理POST请求</p><p>专用于浏览器提交数据</p></blockquote><hr><h2 id="二-Django的设计模式及模板层">二. Django的设计模式及模板层<a class="header-anchor" href="#二-Django的设计模式及模板层"></a></h2><h3 id="MVC和MTV">MVC和MTV<a class="header-anchor" href="#MVC和MTV"></a></h3><h4 id="传统的MVC">传统的MVC<a class="header-anchor" href="#传统的MVC"></a></h4><blockquote><p>MVC代表<code>Model-View-Controller</code>(模型-视图-控制器)模式。</p><ul class="lvl-1"><li class="lvl-2"><p><input type="checkbox" id="checkbox10" checked="true"><label for="checkbox10"></label><code>M模型层(Model)</code>,主要用于对数据库层的封装</p></li><li class="lvl-2"><p><input type="checkbox" id="checkbox11" checked="true"><label for="checkbox11"></label><code>V视图层(View)</code>,用于向用户展示结果(WHAT + HOW)</p></li><li class="lvl-2"><p><input type="checkbox" id="checkbox12" checked="true"><label for="checkbox12"></label><code>C控制(Controller)</code>,用于处理请求、获取数据、返回结果(重要)</p></li></ul><p>作用:<code>降低模块间的耦合度(解耦)</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052338248.png" alt=""></p></blockquote><h4 id="Django的MTV模式">Django的MTV模式<a class="header-anchor" href="#Django的MTV模式"></a></h4><blockquote><p>MTV代表<code>Model-Template-View</code>(模型-模板-视图)模式。</p><ul class="lvl-1"><li class="lvl-2"><p><input type="checkbox" id="checkbox13" checked="true"><label for="checkbox13"></label><code>M模型层(Model)</code>负责与数据库交互</p></li><li class="lvl-2"><p><input type="checkbox" id="checkbox14" checked="true"><label for="checkbox14"></label><code>T模板层(Template)</code>负责呈现内容到浏览器(HOW)</p></li><li class="lvl-2"><p><input type="checkbox" id="checkbox15" checked="true"><label for="checkbox15"></label><code>V视图层(View)</code>是核心,负责接收请求、获取数据、返回结果(WHAT)</p></li></ul><p>作用:<code>降低模块间的耦合度(解耦)</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052340887.png" alt=""></p><p>---------------------------------------------------------------------------------------------------------------------------------</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052341004.jpg" alt=""></p></blockquote><h3 id="模板层">模板层<a class="header-anchor" href="#模板层"></a></h3><h4 id="什么是模板">什么是模板<a class="header-anchor" href="#什么是模板"></a></h4><blockquote><p>1、模板是可以根据<code>字典</code>数据动态变化的<code>html网页</code></p><p>2、模板可以<code>根据视图中传递的字典数据动态生成相应的HTML网页</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052342133.png" alt=""></p></blockquote><h4 id="模板配置">模板配置<a class="header-anchor" href="#模板配置"></a></h4><blockquote><p>创建模板文件夹 <code><项目名>/templates</code></p><p>在<code>settings.py</code>中<code>TEMPLATES</code>配置项</p><p>1.BACKEND:指定模板的引擎</p><p>2.<code>DIRS</code>:模板的搜索目录(可以是一个或多个)</p><p>3.APP_DIRS:是否要在应用中的templates文件夹中搜索模板文件</p><p>4.OPTIONS:有关模板的选项</p><p>·配置项中 需要修改部分</p><p>设置DIRS - <code>'DIRS': [os.path.join(BASE_DIR, 'templates')],</code></p><p>------------------------------------------------------------------</p><p>演示</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"> <项目同名文件夹下>/settings.py</span><br><span class="line">TEMPLATES = [</span><br><span class="line"> {</span><br><span class="line"> ...</span><br><span class="line"> <span class="string">'DIRS'</span>: [os.path.join(BASE_DIR, <span class="string">'templates'</span>)],</span><br><span class="line"> ...</span><br></pre></td></tr></table></figure></blockquote><h4 id="模板的加载方式">模板的加载方式<a class="header-anchor" href="#模板的加载方式"></a></h4><blockquote><p><strong>方案1</strong> - 通过loader获取模板,通过HttpResponse进行响应(特点:麻烦)</p><p>在视图函数中:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> django.template <span class="keyword">import</span> loader</span><br><span class="line"><span class="comment"># 1.通过 loader 加载模板</span></span><br><span class="line">t = loader.get_template(<span class="string">"模板文件名"</span>)</span><br><span class="line"><span class="comment"># 2.将 t 转换成 HTML 字符串</span></span><br><span class="line">html = t.reader(字典数据)</span><br><span class="line"><span class="comment"># 3.用响应对象将转换的字符串内容返回给浏览器</span></span><br><span class="line"><span class="keyword">return</span> HttpResponse(html)</span><br></pre></td></tr></table></figure><p>--------------------------------------------------------------------------------------</p><p><strong>演示</strong></p><p><a href="http://127.0.0.1:8000/test_html">http://127.0.0.1:8000/test_html</a></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052345270.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"> <项目同名文件夹下>/urls.py</span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'test_html'</span>, views.test_html)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> <项目同名文件夹下>/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_html</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">from</span> django.template <span class="keyword">import</span> loader</span><br><span class="line"> t = loader.get_template(<span class="string">'test_html.html'</span>)</span><br><span class="line"> html = t.render()</span><br><span class="line"> <span class="keyword">return</span> HttpResponse(html)</span><br><span class="line"></span><br><span class="line"> <项目文件夹下>/templates/test_html.html</span><br><span class="line"><h3>我是模板层的~~~~</h3></span><br></pre></td></tr></table></figure><p>---------------------------------------------------------------------------------------------------------------------------------</p><p><strong>方案2</strong> - 通过render() 直接加载并响应模板(特点:方便,大量使用这种)</p><p>在视图函数中:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> django.shortcuts <span class="keyword">import</span> render</span><br><span class="line"><span class="keyword">return</span> render(request, <span class="string">'模板文件名'</span>, 字典数据)</span><br></pre></td></tr></table></figure><p>--------------------------------------------------------------------------------------</p><p><strong>演示</strong></p><p><a href="http://127.0.0.1:8000/test_html">http://127.0.0.1:8000/test_html</a></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052346308.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"> <项目同名文件夹下>/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_html</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="comment"># 方案2</span></span><br><span class="line"> <span class="keyword">from</span> django.shortcuts <span class="keyword">import</span> render</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'test_html.html'</span>)</span><br></pre></td></tr></table></figure></blockquote><h4 id="视图层与模板层之间的交互">视图层与模板层之间的交互<a class="header-anchor" href="#视图层与模板层之间的交互"></a></h4><blockquote><p>1、视图函数中可以将Python<code>变量</code>封装到字典中传递到模板</p><p>样例:</p><p>def xxx_view(request):<br>dic = {<br>“变量1”: “值1”,<br>“变量2”: “值2”,<br>}<br>return render(request, ‘xxx.html’, <code>dic</code>)</p><p>2、模板中,我们可以用 <strong></strong> 的语法 调用视图传进来的变量</p><p>--------------------------------------------------------------------------------------</p><p><strong>演示</strong></p><p><a href="http://127.0.0.1:8000/test_html">http://127.0.0.1:8000/test_html</a></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052348278.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"> <项目同名文件夹下>/urls.py</span><br><span class="line">urlpatterns = [</span><br><span class="line"> ...</span><br><span class="line"> path(<span class="string">'test_html'</span>, views.test_html)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> <项目同名文件夹下>/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_html</span>(<span class="params">request</span>):</span><br><span class="line"> <span class="keyword">from</span> django.shortcuts <span class="keyword">import</span> render</span><br><span class="line"> dic = {<span class="string">'username'</span>: <span class="string">'peng'</span>, <span class="string">'age'</span>: <span class="number">23</span>}</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">'test_html.html'</span>, dic)</span><br><span class="line"></span><br><span class="line"> <项目文件夹下>/templates/test_html.html</span><br><span class="line"><h3>{{ username }}是模板层的~~~~</h3></span><br></pre></td></tr></table></figure></blockquote><hr>]]></content>
|
|
1373
1373
|
|
|
1374
1374
|
|
|
1375
1375
|
<categories>
|
|
@@ -1543,7 +1543,7 @@
|
|
|
1543
1543
|
<link href="/posts/8236.html"/>
|
|
1544
1544
|
<url>/posts/8236.html</url>
|
|
1545
1545
|
|
|
1546
|
-
<content type="html"><![CDATA[<h1 id="Hexo-搭建私人博客">Hexo 搭建私人博客<a class="header-anchor" href="#Hexo-搭建私人博客"></a></h1><h2 id="一-介绍">一. 介绍<a class="header-anchor" href="#一-介绍"></a></h2><h3 id="1-1-Hexo">1.1 Hexo<a class="header-anchor" href="#1-1-Hexo"></a></h3><blockquote><p>Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 <a href="http://daringfireball.net/projects/markdown/">Markdown</a>(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。<a href="https://hexo.io">Hexo 官网</a></p></blockquote><h3 id="1-2-Pure-主题">1.2 Pure 主题<a class="header-anchor" href="#1-2-Pure-主题"></a></h3><p><a href="https://github.com/cofess/hexo-theme-pure">https://github.com/cofess/hexo-theme-pure</a></p><p><a href="https://blog.cofess.com/">https://blog.cofess.com/</a></p><hr><h2 id="二-参考">二. 参考<a class="header-anchor" href="#二-参考"></a></h2><p>Hexo 官网<a href="https://hexo.io/zh-cn/docs/index.html">https://hexo.io/zh-cn/docs/index.html</a></p><p>Pure 项目地址<a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md">https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md</a></p><h3 id="搭建-魔改">搭建 & 魔改<a class="header-anchor" href="#搭建-魔改"></a></h3><ul class="lvl-0"><li class="lvl-2"><p><a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md">Pure 项目中文文档</a></p></li><li class="lvl-2"><p><a href="https://hwame.top/20200520/hello-hexo-setup-deploy.html">https://hwame.top</a></p></li><li class="lvl-2"><p><a href="https://blog.cofess.com/2017/11/01/hexo-blog-theme-pure-usage-description.html">作者: Hexo博客主题pure使用说明</a></p></li><li class="lvl-2"><p><a href="https://www.cnblogs.com/zzk31/p/14062887.html">https://www.cnblogs.com/zzk31/p/14062887.html</a></p></li><li class="lvl-2"><p><a href="https://blog.csdn.net/qq_42983502/article/details/106745567">https://blog.csdn.net/qq_42983502/article/details/106745567</a></p></li><li class="lvl-2"><p>gitalk</p><ul class="lvl-2"><li class="lvl-4"><a href="https://www.jianshu.com/p/b1161eb3f848">https://www.jianshu.com/p/b1161eb3f848</a></li><li class="lvl-4"><a href="https://cors-anywhere.herokuapp.com/corsdemo">https://cors-anywhere.herokuapp.com/corsdemo</a></li><li class="lvl-4"><a href="https://www.cnblogs.com/qisi007/p/13731562.html">https://www.cnblogs.com/qisi007/p/13731562.html</a></li><li class="lvl-4"><a href="https://www.jianshu.com/p/02fc71f3633f">https://www.jianshu.com/p/02fc71f3633f</a></li></ul></li></ul><hr><h2 id="三-命令">三. 命令<a class="header-anchor" href="#三-命令"></a></h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo clean ; hexo g ; hexo d ; hexo s</span><br></pre></td></tr></table></figure><hr><h2 id="四-评论-收录">四. 评论 & 收录<a class="header-anchor" href="#四-评论-收录"></a></h2><p>Valine 评论<a href="https://www.leancloud.cn/">https://www.leancloud.cn/</a></p><p>Valine 评论<a href="https://www.leancloud.app/">https://www.leancloud.app/</a>国外站点,国内账号受限,域名没白嫖成功,可能是这个原因 → <a href="https://forum.leancloud.cn/t/2022-8/25408">https://forum.leancloud.cn/t/2022-8/25408</a></p><p>谷歌收录<a href="">https://search.google.com/search-console</a></p><p>百度收录<a href="https://ziyuan.baidu.com">https://ziyuan.baidu.com</a></p><p>MD5 在线加密<a href="https://md5jiami.bmcx.com/">https://md5jiami.bmcx.com/</a>评论区通过密文,识别博主身份</p><hr><h2 id="五-相关路径">五. 相关路径<a class="header-anchor" href="#五-相关路径"></a></h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">[<span class="symbol">文章路径</span>]: </span><br><span class="line"><span class="link">\source\_posts</span></span><br><span class="line">[<span class="symbol">站点配置文件</span>]: </span><br><span class="line"><span class="link">\_config.yml</span></span><br><span class="line">[<span class="symbol">主题配置文件</span>]: </span><br><span class="line"><span class="link">\themes\pure\_config.yml"关于、个人介绍、公告"</span></span><br><span class="line">[<span class="symbol">友链文件</span>]: </span><br><span class="line"><span class="link">\source\_data\links.yml</span></span><br><span class="line">[<span class="symbol">语言</span>]: </span><br><span class="line"><span class="link">\themes\pure\languages</span></span><br><span class="line">[<span class="symbol">左下角运行时间</span>]: </span><br><span class="line"><span class="link">\themes\pure\layout\_common\footer.ejs"时间、版权"</span></span><br><span class="line">[<span class="symbol">评论角色配置</span>]: </span><br><span class="line"><span class="link">\themes\pure\layout\_script\_comment\valine.ejs</span></span><br><span class="line">[<span class="symbol">css样式</span>]:</span><br><span class="line"><span class="link">\themes\pure\source\css\style.css</span></span><br><span class="line">[<span class="symbol">搜索栏限制</span>]: </span><br><span class="line"><span class="link">\themes\pure\source\js\insight.js"160行"</span></span><br></pre></td></tr></table></figure><hr><h2 id="六-内容样例">六. 内容样例<a class="header-anchor" href="#六-内容样例"></a></h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: Test</span><br><span class="line">date: 2022-08-28 00:09:00</span><br><span class="line">updated: 2022-08-28 00:09:01</span><br><span class="line">thumbnail: https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-fzuycsadwt/image/test.png</span><br><span class="line">tags:</span><br><span class="line"><span class="bullet"> -</span> Test</span><br><span class="line">category:</span><br><span class="line"><span class="bullet"> -</span> Test</span><br><span class="line">toc: true</span><br><span class="line"><span class="section">top: true</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line">描述<!-- more --></span><br></pre></td></tr></table></figure><h3 id="文章指定多个-category">文章指定多个 category<a class="header-anchor" href="#文章指定多个-category"></a></h3><blockquote><p>多个分类</p><p>如果我们的要求是将文章同时分到两个或者多个不同的类目下呢?官方给出的方法是:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">categories:</span><br><span class="line"> - [Sports]</span><br><span class="line"> - [Baseball]</span><br></pre></td></tr></table></figure><p>参考文章:<a href="https://www.jianshu.com/p/4438c417611e">Hexo 一篇文章多个 categories https://www.jianshu.com/p/4438c417611e</a></p></blockquote><hr><h2 id="七-自定义">七. 自定义<a class="header-anchor" href="#七-自定义"></a></h2><h3 id="7-1-搜索框索引突破-5">7.1 搜索框索引突破 5<a class="header-anchor" href="#7-1-搜索框索引突破-5"></a></h3><ol><li class="lvl-3"><p><code>F12</code> 定位到搜索框的 类选择器 为 ins-section-header</p></li><li class="lvl-3"><p>grep,定位到配置文件为 <code>\themes\pure\source\js\insight.js</code></p></li><li class="lvl-3"><p>Ctrl + F,搜索 5,定位到第 160 行,修改限制</p></li></ol><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075511578.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075224471.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075722865.png" alt=""></p></blockquote><h3 id="7-2-左侧头像链接,target-修改为-self">7.2 左侧头像链接,target 修改为 _self<a class="header-anchor" href="#7-2-左侧头像链接,target-修改为-self"></a></h3><p>a 标签,修改 target: ‘_blank’ → ‘_self’</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080811356.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080916410.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080945424.png" alt=""></p></blockquote><hr><h3 id="7-3-文章目录,一级标题不跳转">7.3 文章目录,一级标题不跳转<a class="header-anchor" href="#7-3-文章目录,一级标题不跳转"></a></h3><p>有时发现一级标题不会跳转</p><p><s>配置文件<code>\node_modules\hexo\lib\plugins\helper\toc.js</code></s></p><p><s>更新下 <code>\node_modules\hexo\lib\plugins\helper\toc.js</code> 文件,又正常了。时灵时不灵的。。。</s></p><p><s>参考<a href="https://hwame.top/20200520/hello-hexo-troubleshooting.html#3-%E5%A6%82%E4%BD%95%E5%8F%96%E6%B6%88%E6%96%87%E7%AB%A0%E7%9B%AE%E5%BD%95%E7%9A%84%E8%87%AA%E5%8A%A8%E7%BC%96%E5%8F%B7">https://hwame.top/如何取消文章目录的自动编号</a></s></p><p>修改 “.\node_modules\hexo-renderer-markdown-it\index.js” level 为 1</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220906033013691.png" alt=""></p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>参考文章:</p><p><a href="https://blog.csdn.net/Fosu_Chenai/article/details/111192850">https://blog.csdn.net/Fosu_Chenai/article/details/111192850 评论</a></p></li></ul><hr><h3 id="7-4-滚动条加粗-加小箭头">7.4 滚动条加粗 + 加小箭头<a class="header-anchor" href="#7-4-滚动条加粗-加小箭头"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>修改 css 样式,路径 <code>.\hexo-source\themes\pure\source\css\style.css</code></p><ol><li class="lvl-5"><code>Ctlrl + F</code> 定位 <code>scrollbar</code>;</li><li class="lvl-5">调高 <code>height</code>,使代码框 右拉滚动条加粗;</li><li class="lvl-5">右侧下拉条变粗;</li></ol><blockquote><p><strong>7.4.1 代码框加粗</strong></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * scrollbar</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar {</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">15px</span>;</span><br><span class="line"> <span class="attribute">height</span>: <span class="number">14px</span>;# 调高</span><br><span class="line"> <span class="attribute">background</span>: transparent;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901164700329.png" alt=""></p><p><strong>7.4.2 右侧下拉条变粗 + 添加小箭头</strong></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * 滚动条箭头</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line">::-webkit-scrollbar-button {</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">0px</span>;</span><br><span class="line"> <span class="attribute">height</span>: <span class="number">4px</span>;</span><br><span class="line"> <span class="attribute">display</span>: block; </span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#c3c3c3</span>;</span><br><span class="line">}</span><br><span class="line">::-webkit-scrollbar {</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">16px</span>;</span><br><span class="line"> <span class="attribute">border</span>: <span class="number">5px</span> solid white;</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-thumb {</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#b0b0b0</span>;</span><br><span class="line"> <span class="attribute">background-clip</span>: padding-box;</span><br><span class="line"> <span class="attribute">border</span>: <span class="number">0.05em</span> solid <span class="number">#eeeeee</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-track {</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#bbbbbb</span>;</span><br><span class="line">}</span><br><span class="line"><span class="comment">/* Buttons */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button {</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#bbbbbb</span>;</span><br><span class="line"> <span class="attribute">display</span>: block;</span><br><span class="line"> <span class="attribute">border-style</span>: solid;</span><br><span class="line"> <span class="attribute">height</span>: <span class="number">13px</span>;</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">16px</span>;</span><br><span class="line">}</span><br><span class="line"><span class="comment">/* Up */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:decrement {</span><br><span class="line"> <span class="attribute">border-width</span>: <span class="number">0px</span> <span class="number">8px</span> <span class="number">8px</span> <span class="number">8px</span>;</span><br><span class="line"> <span class="attribute">border-color</span>: transparent transparent <span class="number">#555555</span> transparent;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:decrement:hover {</span><br><span class="line"> <span class="attribute">border-color</span>: transparent transparent <span class="number">#777777</span> transparent;</span><br><span class="line">}</span><br><span class="line"><span class="comment">/* Down */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:increment {</span><br><span class="line"> <span class="attribute">border-width</span>: <span class="number">8px</span> <span class="number">8px</span> <span class="number">0</span> <span class="number">8px</span>;</span><br><span class="line"> <span class="attribute">border-color</span>: <span class="number">#555555</span> transparent transparent transparent;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-button:vertical:single-button:increment:hover {</span><br><span class="line"> <span class="attribute">border-color</span>: <span class="number">#777777</span> transparent transparent transparent;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901164914382.png" alt=""></p></blockquote></li></ul><p><strong>参考文章</strong></p><ul class="lvl-0"><li class="lvl-2"><p><a href="http://www.qianduanheidong.com/blog/article/27901/a1c9346c7830d6ffa3f2/">右侧下拉条新增箭头</a></p></li><li class="lvl-2"><p><a href="https://www.php.cn/css-tutorial-475268.html">:-webkit-scrollbar 滚动条整体部分 https://www.php.cn/css-tutorial-475268.html</a></p></li></ul><h3 id="7-5-Valine-评论框添加一言">7.5 Valine 评论框添加一言<a class="header-anchor" href="#7-5-Valine-评论框添加一言"></a></h3><p><strong>参考文章</strong></p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://blog.justlovesmile.top/posts/27831.html">https://blog.justlovesmile.top/posts/27831.html</a></p></li></ul><p>偶然看到的文章,然后自己就加了这个功能。</p><ul class="lvl-0"><li class="lvl-2"><p>路径:<code>.\themes\pure\layout\_script\_comment\valine.ejs</code>;</p></li><li class="lvl-2"><p>加到最后 <code></script></code> 标签之前;c=j 请求获得网易云的句子,开始网抑云吧;</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">fetch('https://v1.hitokoto.cn/?c=j')</span><br><span class="line">.then(response => response.json())</span><br><span class="line">.then(data => {</span><br><span class="line"> document.getElementById("veditor").setAttribute("placeholder",data.hitokoto+"__"+data.from);</span><br><span class="line">})</span><br><span class="line">.catch(console.error)</span><br></pre></td></tr></table></figure></li></ul><blockquote><p>修改方法:</p><ol><li class="lvl-3"><p>找到博客对应添加valine的位置,例如Ayer主题的位于hexo\themes\ayer\layout_partial\post\valine.ejs</p></li><li class="lvl-3"><p>在内部添加一段代码:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><script type="text/javascript"></span><br><span class="line"> fetch('https://v1.hitokoto.cn')</span><br><span class="line"> .then(response => response.json())</span><br><span class="line"> .then(data => {</span><br><span class="line"> document.getElementById("veditor").setAttribute("placeholder",data.hitokoto+"__"+data.from);</span><br><span class="line"> })</span><br><span class="line"> .catch(console.error)</span><br><span class="line"></script></span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>Api接口说明:<br>(1)<a href="https://v1.hitokoto.cn/">https://v1.hitokoto.cn/</a> (从7种分类中随机抽取)<br>(2)<a href="https://v1.hitokoto.cn/?c=b">https://v1.hitokoto.cn/?c=b</a> (请求获得一个分类是漫画的句子)<br>参数说明<br>a动画<br>b漫画<br>c游戏<br>d文学<br>e原创<br>f来自网络<br>g其他<br>h影视<br>i诗词<br>j网易云<br>k哲学<br>l抖机灵<br>其他作为动画类型处理<br>可选择多个分类,例如: ?c=a&c=c</p></li></ol><p>(3)<a href="https://v1.hitokoto.cn/?c=f&encode=text">https://v1.hitokoto.cn/?c=f&encode=text</a> (请求获得一个来自网络的句子,并以纯文本格式输出)</p><ol start="4"><li class="lvl-3"><p>返回的格式说明<br>返回参数名称描述<br>id一言标识<br>hitokoto一言正文。编码方式 unicode。使用 utf-8。<br>type类型<br>from一言的出处<br>from_who一言的作者<br>creator添加者<br>creator_uid添加者用户标识<br>reviewer审核员标识<br>uuid一言唯一标识;可以链接到 <a href="https://hitokoto.cn?uuid=%5Buuid%5D">https://hitokoto.cn?uuid=[uuid]</a> 查看这个一言的完整信息<br>commit_from提交方式<br>created_at添加时间<br>length句子长度<br>例如:返回的data,通过data.hitokoto获取句子正文</p></li></ol><p>作者: Justlovesmile<br>链接: <a href="https://blog.justlovesmile.top/posts/27831.html">https://blog.justlovesmile.top/posts/27831.html</a><br>来源: Justlovesmile’s BLOG<br>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</p></blockquote><p>PS:这位大佬的博客真好看~~</p><h3 id="7-6-左侧-归档、分类-改为默认收起">7.6 左侧 归档、分类 改为默认收起<a class="header-anchor" href="#7-6-左侧-归档、分类-改为默认收起"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>默认是展开的</p></li></ul><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203849607.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203907981.png" alt=""></p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>修改以下文件,改为收起状态。如图</p><ul class="lvl-2"><li class="lvl-4">style=“height: 0px” 应该可以不用写,收起状态默认就是 0 ~~</li></ul></li></ul><blockquote><p><code>.\themes\pure\layout\categories.ejs</code></p><p><code>.\themes\pure\layout\_partial\archive.ejs</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203746673.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203807739.png" alt=""></p></blockquote><hr><h2 id="八-未解决的小需求">八. 未解决的小需求<a class="header-anchor" href="#八-未解决的小需求"></a></h2><ol><li class="lvl-3"><p>(已解决,#7.3)一级目录,右侧导航栏 有时跳转失败;</p></li><li class="lvl-3"><p>Valine 评论系统,下面的评论 被@后,未显示 @信息,而别人的是成功的;</p><blockquote><p>我的</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901171817579.png" alt=""></p><p>其他大佬的</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901171912131.png" alt=""></p></blockquote></li><li class="lvl-3"><p>引用时 使用 #,会被导航目录误认为 一级标题;</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901172133945.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901172316157.png" alt=""></p></blockquote></li><li class="lvl-3"><p>(已解决)生成在 /public 目录的静态文件都被压缩了,<s>我看别人的没被压缩,不清楚啥原因。</s> 因为配置了这个 <a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md#%E5%8D%9A%E5%AE%A2%E4%BC%98%E5%8C%96">https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md 博客优化</a> 压缩了文件</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901175404486.png" alt=""></p></blockquote></li><li class="lvl-3"><p>(已解决)文章内部一级、二级…标题左侧无锚点</p><blockquote><p>理想效果图</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220906034109271.png" alt=""></p><p><s>似乎是环境配置问题,我用虚拟机推送静态文件,就有显示;用真实 win机 推送 就没有锚点,重装 git 也没显示(可能不是 git 的问题)。。。</s></p><p>因为压缩了静态文件,全部注释 <code>hexo-neat</code> 配置。<br>参考<br><a href="https://github.com/cofess/hexo-theme-pure#hexo-neat">https://github.com/cofess/hexo-theme-pure#hexo-neat</a><br><a href="https://github.com/rozbo/hexo-neat#options">https://github.com/rozbo/hexo-neat#options</a></p></blockquote></li></ol><p>无伤大雅,<s>我一般一级标题写的是文章标题</s>;评论区也就是个摆设;<s>静态文件被压缩,可能别人还觉得我是故意,嘿</s>~~</p><p>最后总结:魔改要适量,太费时 还得不到提升,不如多看几个前端视频 多写几篇文章。。。</p><hr>]]></content>
|
|
1546
|
+
<content type="html"><![CDATA[<h1 id="Hexo-搭建私人博客">Hexo 搭建私人博客<a class="header-anchor" href="#Hexo-搭建私人博客"></a></h1><h2 id="一-介绍">一. 介绍<a class="header-anchor" href="#一-介绍"></a></h2><h3 id="1-1-Hexo">1.1 Hexo<a class="header-anchor" href="#1-1-Hexo"></a></h3><blockquote><p>Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 <a href="http://daringfireball.net/projects/markdown/">Markdown</a>(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。<a href="https://hexo.io">Hexo 官网</a></p></blockquote><h3 id="1-2-Pure-主题">1.2 Pure 主题<a class="header-anchor" href="#1-2-Pure-主题"></a></h3><p><a href="https://github.com/cofess/hexo-theme-pure">https://github.com/cofess/hexo-theme-pure</a></p><p><a href="https://blog.cofess.com/">https://blog.cofess.com/</a></p><hr><h2 id="二-参考">二. 参考<a class="header-anchor" href="#二-参考"></a></h2><p>Hexo 官网<a href="https://hexo.io/zh-cn/docs/index.html">https://hexo.io/zh-cn/docs/index.html</a></p><p>Pure 项目地址<a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md">https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md</a></p><h3 id="搭建-魔改">搭建 & 魔改<a class="header-anchor" href="#搭建-魔改"></a></h3><ul class="lvl-0"><li class="lvl-2"><p><a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md">Pure 项目中文文档</a></p></li><li class="lvl-2"><p><a href="https://hwame.top/20200520/hello-hexo-setup-deploy.html">https://hwame.top</a></p></li><li class="lvl-2"><p><a href="https://blog.cofess.com/2017/11/01/hexo-blog-theme-pure-usage-description.html">作者: Hexo博客主题pure使用说明</a></p></li><li class="lvl-2"><p><a href="https://www.cnblogs.com/zzk31/p/14062887.html">https://www.cnblogs.com/zzk31/p/14062887.html</a></p></li><li class="lvl-2"><p><a href="https://blog.csdn.net/qq_42983502/article/details/106745567">https://blog.csdn.net/qq_42983502/article/details/106745567</a></p></li><li class="lvl-2"><p>gitalk</p><ul class="lvl-2"><li class="lvl-4"><a href="https://www.jianshu.com/p/b1161eb3f848">https://www.jianshu.com/p/b1161eb3f848</a></li><li class="lvl-4"><a href="https://cors-anywhere.herokuapp.com/corsdemo">https://cors-anywhere.herokuapp.com/corsdemo</a></li><li class="lvl-4"><a href="https://www.cnblogs.com/qisi007/p/13731562.html">https://www.cnblogs.com/qisi007/p/13731562.html</a></li><li class="lvl-4"><a href="https://www.jianshu.com/p/02fc71f3633f">https://www.jianshu.com/p/02fc71f3633f</a></li></ul></li></ul><hr><h2 id="三-命令">三. 命令<a class="header-anchor" href="#三-命令"></a></h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo clean ; hexo g ; hexo d ; hexo s</span><br></pre></td></tr></table></figure><hr><h2 id="四-评论-收录">四. 评论 & 收录<a class="header-anchor" href="#四-评论-收录"></a></h2><p>Valine 评论<a href="https://www.leancloud.cn/">https://www.leancloud.cn/</a></p><p>Valine 评论<a href="https://www.leancloud.app/">https://www.leancloud.app/</a>国外站点,国内账号受限,域名没白嫖成功,可能是这个原因 → <a href="https://forum.leancloud.cn/t/2022-8/25408">https://forum.leancloud.cn/t/2022-8/25408</a></p><p>谷歌收录<a href="">https://search.google.com/search-console</a></p><p>百度收录<a href="https://ziyuan.baidu.com">https://ziyuan.baidu.com</a></p><p>MD5 在线加密<a href="https://md5jiami.bmcx.com/">https://md5jiami.bmcx.com/</a>评论区通过密文,识别博主身份</p><hr><h2 id="五-相关路径">五. 相关路径<a class="header-anchor" href="#五-相关路径"></a></h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">[<span class="symbol">文章路径</span>]: </span><br><span class="line"><span class="link">\source\_posts</span></span><br><span class="line">[<span class="symbol">站点配置文件</span>]: </span><br><span class="line"><span class="link">\_config.yml</span></span><br><span class="line">[<span class="symbol">主题配置文件</span>]: </span><br><span class="line"><span class="link">\themes\pure\_config.yml"关于、个人介绍、公告"</span></span><br><span class="line">[<span class="symbol">友链文件</span>]: </span><br><span class="line"><span class="link">\source\_data\links.yml</span></span><br><span class="line">[<span class="symbol">语言</span>]: </span><br><span class="line"><span class="link">\themes\pure\languages</span></span><br><span class="line">[<span class="symbol">左下角运行时间</span>]: </span><br><span class="line"><span class="link">\themes\pure\layout\_common\footer.ejs"时间、版权"</span></span><br><span class="line">[<span class="symbol">评论角色配置</span>]: </span><br><span class="line"><span class="link">\themes\pure\layout\_script\_comment\valine.ejs</span></span><br><span class="line">[<span class="symbol">css样式</span>]:</span><br><span class="line"><span class="link">\themes\pure\source\css\style.css</span></span><br><span class="line">[<span class="symbol">搜索栏限制</span>]: </span><br><span class="line"><span class="link">\themes\pure\source\js\insight.js"160行"</span></span><br></pre></td></tr></table></figure><hr><h2 id="六-内容样例">六. 内容样例<a class="header-anchor" href="#六-内容样例"></a></h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: Test</span><br><span class="line">date: 2022-08-28 00:09:00</span><br><span class="line">updated: 2022-08-28 00:09:01</span><br><span class="line">thumbnail: https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-fzanaoacgl/image/test.png</span><br><span class="line">tags:</span><br><span class="line"><span class="bullet"> -</span> Test</span><br><span class="line">category:</span><br><span class="line"><span class="bullet"> -</span> Test</span><br><span class="line">toc: true</span><br><span class="line"><span class="section">top: true</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line">描述<!-- more --></span><br></pre></td></tr></table></figure><h3 id="文章指定多个-category">文章指定多个 category<a class="header-anchor" href="#文章指定多个-category"></a></h3><blockquote><p>多个分类</p><p>如果我们的要求是将文章同时分到两个或者多个不同的类目下呢?官方给出的方法是:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">categories:</span><br><span class="line"> - [Sports]</span><br><span class="line"> - [Baseball]</span><br></pre></td></tr></table></figure><p>参考文章:<a href="https://www.jianshu.com/p/4438c417611e">Hexo 一篇文章多个 categories https://www.jianshu.com/p/4438c417611e</a></p></blockquote><hr><h2 id="七-自定义">七. 自定义<a class="header-anchor" href="#七-自定义"></a></h2><h3 id="7-1-搜索框索引突破-5">7.1 搜索框索引突破 5<a class="header-anchor" href="#7-1-搜索框索引突破-5"></a></h3><ol><li class="lvl-3"><p><code>F12</code> 定位到搜索框的 类选择器 为 ins-section-header</p></li><li class="lvl-3"><p>grep,定位到配置文件为 <code>\themes\pure\source\js\insight.js</code></p></li><li class="lvl-3"><p>Ctrl + F,搜索 5,定位到第 160 行,修改限制</p></li></ol><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075511578.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075224471.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075722865.png" alt=""></p></blockquote><h3 id="7-2-左侧头像链接,target-修改为-self">7.2 左侧头像链接,target 修改为 _self<a class="header-anchor" href="#7-2-左侧头像链接,target-修改为-self"></a></h3><p>a 标签,修改 target: ‘_blank’ → ‘_self’</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080811356.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080916410.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080945424.png" alt=""></p></blockquote><hr><h3 id="7-3-文章目录,一级标题不跳转">7.3 文章目录,一级标题不跳转<a class="header-anchor" href="#7-3-文章目录,一级标题不跳转"></a></h3><p>有时发现一级标题不会跳转</p><p><s>配置文件<code>\node_modules\hexo\lib\plugins\helper\toc.js</code></s></p><p><s>更新下 <code>\node_modules\hexo\lib\plugins\helper\toc.js</code> 文件,又正常了。时灵时不灵的。。。</s></p><p><s>参考<a href="https://hwame.top/20200520/hello-hexo-troubleshooting.html#3-%E5%A6%82%E4%BD%95%E5%8F%96%E6%B6%88%E6%96%87%E7%AB%A0%E7%9B%AE%E5%BD%95%E7%9A%84%E8%87%AA%E5%8A%A8%E7%BC%96%E5%8F%B7">https://hwame.top/如何取消文章目录的自动编号</a></s></p><p>修改 “.\node_modules\hexo-renderer-markdown-it\index.js” level 为 1</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220906033013691.png" alt=""></p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>参考文章:</p><p><a href="https://blog.csdn.net/Fosu_Chenai/article/details/111192850">https://blog.csdn.net/Fosu_Chenai/article/details/111192850 评论</a></p></li></ul><hr><h3 id="7-4-滚动条加粗-加小箭头">7.4 滚动条加粗 + 加小箭头<a class="header-anchor" href="#7-4-滚动条加粗-加小箭头"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>修改 css 样式,路径 <code>.\hexo-source\themes\pure\source\css\style.css</code></p><ol><li class="lvl-5"><code>Ctlrl + F</code> 定位 <code>scrollbar</code>;</li><li class="lvl-5">调高 <code>height</code>,使代码框 右拉滚动条加粗;</li><li class="lvl-5">右侧下拉条变粗;</li></ol><blockquote><p><strong>7.4.1 代码框加粗</strong></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * scrollbar</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar {</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">15px</span>;</span><br><span class="line"> <span class="attribute">height</span>: <span class="number">14px</span>;# 调高</span><br><span class="line"> <span class="attribute">background</span>: transparent;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901164700329.png" alt=""></p><p><strong>7.4.2 右侧下拉条变粗 + 添加小箭头</strong></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * 滚动条箭头</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line">::-webkit-scrollbar-button {</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">0px</span>;</span><br><span class="line"> <span class="attribute">height</span>: <span class="number">4px</span>;</span><br><span class="line"> <span class="attribute">display</span>: block; </span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#c3c3c3</span>;</span><br><span class="line">}</span><br><span class="line">::-webkit-scrollbar {</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">16px</span>;</span><br><span class="line"> <span class="attribute">border</span>: <span class="number">5px</span> solid white;</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-thumb {</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#b0b0b0</span>;</span><br><span class="line"> <span class="attribute">background-clip</span>: padding-box;</span><br><span class="line"> <span class="attribute">border</span>: <span class="number">0.05em</span> solid <span class="number">#eeeeee</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-track {</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#bbbbbb</span>;</span><br><span class="line">}</span><br><span class="line"><span class="comment">/* Buttons */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button {</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#bbbbbb</span>;</span><br><span class="line"> <span class="attribute">display</span>: block;</span><br><span class="line"> <span class="attribute">border-style</span>: solid;</span><br><span class="line"> <span class="attribute">height</span>: <span class="number">13px</span>;</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">16px</span>;</span><br><span class="line">}</span><br><span class="line"><span class="comment">/* Up */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:decrement {</span><br><span class="line"> <span class="attribute">border-width</span>: <span class="number">0px</span> <span class="number">8px</span> <span class="number">8px</span> <span class="number">8px</span>;</span><br><span class="line"> <span class="attribute">border-color</span>: transparent transparent <span class="number">#555555</span> transparent;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:decrement:hover {</span><br><span class="line"> <span class="attribute">border-color</span>: transparent transparent <span class="number">#777777</span> transparent;</span><br><span class="line">}</span><br><span class="line"><span class="comment">/* Down */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:increment {</span><br><span class="line"> <span class="attribute">border-width</span>: <span class="number">8px</span> <span class="number">8px</span> <span class="number">0</span> <span class="number">8px</span>;</span><br><span class="line"> <span class="attribute">border-color</span>: <span class="number">#555555</span> transparent transparent transparent;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-button:vertical:single-button:increment:hover {</span><br><span class="line"> <span class="attribute">border-color</span>: <span class="number">#777777</span> transparent transparent transparent;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901164914382.png" alt=""></p></blockquote></li></ul><p><strong>参考文章</strong></p><ul class="lvl-0"><li class="lvl-2"><p><a href="http://www.qianduanheidong.com/blog/article/27901/a1c9346c7830d6ffa3f2/">右侧下拉条新增箭头</a></p></li><li class="lvl-2"><p><a href="https://www.php.cn/css-tutorial-475268.html">:-webkit-scrollbar 滚动条整体部分 https://www.php.cn/css-tutorial-475268.html</a></p></li></ul><h3 id="7-5-Valine-评论框添加一言">7.5 Valine 评论框添加一言<a class="header-anchor" href="#7-5-Valine-评论框添加一言"></a></h3><p><strong>参考文章</strong></p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://blog.justlovesmile.top/posts/27831.html">https://blog.justlovesmile.top/posts/27831.html</a></p></li></ul><p>偶然看到的文章,然后自己就加了这个功能。</p><ul class="lvl-0"><li class="lvl-2"><p>路径:<code>.\themes\pure\layout\_script\_comment\valine.ejs</code>;</p></li><li class="lvl-2"><p>加到最后 <code></script></code> 标签之前;c=j 请求获得网易云的句子,开始网抑云吧;</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">fetch('https://v1.hitokoto.cn/?c=j')</span><br><span class="line">.then(response => response.json())</span><br><span class="line">.then(data => {</span><br><span class="line"> document.getElementById("veditor").setAttribute("placeholder",data.hitokoto+"__"+data.from);</span><br><span class="line">})</span><br><span class="line">.catch(console.error)</span><br></pre></td></tr></table></figure></li></ul><blockquote><p>修改方法:</p><ol><li class="lvl-3"><p>找到博客对应添加valine的位置,例如Ayer主题的位于hexo\themes\ayer\layout_partial\post\valine.ejs</p></li><li class="lvl-3"><p>在内部添加一段代码:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><script type="text/javascript"></span><br><span class="line"> fetch('https://v1.hitokoto.cn')</span><br><span class="line"> .then(response => response.json())</span><br><span class="line"> .then(data => {</span><br><span class="line"> document.getElementById("veditor").setAttribute("placeholder",data.hitokoto+"__"+data.from);</span><br><span class="line"> })</span><br><span class="line"> .catch(console.error)</span><br><span class="line"></script></span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>Api接口说明:<br>(1)<a href="https://v1.hitokoto.cn/">https://v1.hitokoto.cn/</a> (从7种分类中随机抽取)<br>(2)<a href="https://v1.hitokoto.cn/?c=b">https://v1.hitokoto.cn/?c=b</a> (请求获得一个分类是漫画的句子)<br>参数说明<br>a动画<br>b漫画<br>c游戏<br>d文学<br>e原创<br>f来自网络<br>g其他<br>h影视<br>i诗词<br>j网易云<br>k哲学<br>l抖机灵<br>其他作为动画类型处理<br>可选择多个分类,例如: ?c=a&c=c</p></li></ol><p>(3)<a href="https://v1.hitokoto.cn/?c=f&encode=text">https://v1.hitokoto.cn/?c=f&encode=text</a> (请求获得一个来自网络的句子,并以纯文本格式输出)</p><ol start="4"><li class="lvl-3"><p>返回的格式说明<br>返回参数名称描述<br>id一言标识<br>hitokoto一言正文。编码方式 unicode。使用 utf-8。<br>type类型<br>from一言的出处<br>from_who一言的作者<br>creator添加者<br>creator_uid添加者用户标识<br>reviewer审核员标识<br>uuid一言唯一标识;可以链接到 <a href="https://hitokoto.cn?uuid=%5Buuid%5D">https://hitokoto.cn?uuid=[uuid]</a> 查看这个一言的完整信息<br>commit_from提交方式<br>created_at添加时间<br>length句子长度<br>例如:返回的data,通过data.hitokoto获取句子正文</p></li></ol><p>作者: Justlovesmile<br>链接: <a href="https://blog.justlovesmile.top/posts/27831.html">https://blog.justlovesmile.top/posts/27831.html</a><br>来源: Justlovesmile’s BLOG<br>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</p></blockquote><p>PS:这位大佬的博客真好看~~</p><h3 id="7-6-左侧-归档、分类-改为默认收起">7.6 左侧 归档、分类 改为默认收起<a class="header-anchor" href="#7-6-左侧-归档、分类-改为默认收起"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>默认是展开的</p></li></ul><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203849607.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203907981.png" alt=""></p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>修改以下文件,改为收起状态。如图</p><ul class="lvl-2"><li class="lvl-4">style=“height: 0px” 应该可以不用写,收起状态默认就是 0 ~~</li></ul></li></ul><blockquote><p><code>.\themes\pure\layout\categories.ejs</code></p><p><code>.\themes\pure\layout\_partial\archive.ejs</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203746673.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203807739.png" alt=""></p></blockquote><hr><h2 id="八-未解决的小需求">八. 未解决的小需求<a class="header-anchor" href="#八-未解决的小需求"></a></h2><ol><li class="lvl-3"><p>(已解决,#7.3)一级目录,右侧导航栏 有时跳转失败;</p></li><li class="lvl-3"><p>Valine 评论系统,下面的评论 被@后,未显示 @信息,而别人的是成功的;</p><blockquote><p>我的</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901171817579.png" alt=""></p><p>其他大佬的</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901171912131.png" alt=""></p></blockquote></li><li class="lvl-3"><p>引用时 使用 #,会被导航目录误认为 一级标题;</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901172133945.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901172316157.png" alt=""></p></blockquote></li><li class="lvl-3"><p>(已解决)生成在 /public 目录的静态文件都被压缩了,<s>我看别人的没被压缩,不清楚啥原因。</s> 因为配置了这个 <a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md#%E5%8D%9A%E5%AE%A2%E4%BC%98%E5%8C%96">https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md 博客优化</a> 压缩了文件</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901175404486.png" alt=""></p></blockquote></li><li class="lvl-3"><p>(已解决)文章内部一级、二级…标题左侧无锚点</p><blockquote><p>理想效果图</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220906034109271.png" alt=""></p><p><s>似乎是环境配置问题,我用虚拟机推送静态文件,就有显示;用真实 win机 推送 就没有锚点,重装 git 也没显示(可能不是 git 的问题)。。。</s></p><p>因为压缩了静态文件,全部注释 <code>hexo-neat</code> 配置。<br>参考<br><a href="https://github.com/cofess/hexo-theme-pure#hexo-neat">https://github.com/cofess/hexo-theme-pure#hexo-neat</a><br><a href="https://github.com/rozbo/hexo-neat#options">https://github.com/rozbo/hexo-neat#options</a></p></blockquote></li></ol><p>无伤大雅,<s>我一般一级标题写的是文章标题</s>;评论区也就是个摆设;<s>静态文件被压缩,可能别人还觉得我是故意,嘿</s>~~</p><p>最后总结:魔改要适量,太费时 还得不到提升,不如多看几个前端视频 多写几篇文章。。。</p><hr>]]></content>
|
|
1547
1547
|
|
|
1548
1548
|
|
|
1549
1549
|
<categories>
|