-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
74 lines (35 loc) · 63.2 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>Django学习笔记(一)</title>
<link href="/2022/01/26/Django%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%80%EF%BC%89/"/>
<url>/2022/01/26/Django%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%80%EF%BC%89/</url>
<content type="html"><![CDATA[<h1 id="Django学习笔记(一)"><a href="#Django学习笔记(一)" class="headerlink" title="Django学习笔记(一)"></a><center>Django学习笔记(一)</center></h1><h2 id="序章"><a href="#序章" class="headerlink" title="序章"></a>序章</h2><p>Django框架的模型结构:MVC结构,分别是模型(Models),视图(Views),控制器(Controller)</p><p>MVC 以一种插件式的、松耦合的方式连接在一起。</p><ul><li>模型(M)- 编写程序应有的功能,负责业务对象与数据库的映射(ORM)。</li><li>视图(V)- 图形界面,负责与用户的交互(页面)。</li><li>控制器(C)- 负责转发请求,对请求进行处理。</li></ul><p>在Django中,采用MVC的一种变体MTV,即模型(Models),模板(Templates),视图(Views)</p><ul><li>M 表示模型(Model):编写程序应有的功能,负责业务对象与数据库的映射(ORM)。</li><li>T 表示模板 (Template):负责如何把页面(html)展示给用户。</li><li>V 表示视图(View):负责业务逻辑,并在适当时候调用 Model和 Template。</li></ul><p>除了以上三层之外,还需要一个 URL 分发器,它的作用是将一个个 URL 的页面请求分发给不同的 View 处理,View 再调用相应的 Model 和 Template</p><p>(以上部分参考自菜鸟教程:<a href="https://www.runoob.com/django/django-intro.html">Django 简介 | 菜鸟教程 (runoob.com)</a>)</p><h2 id="一、创建一个项目"><a href="#一、创建一个项目" class="headerlink" title="一、创建一个项目"></a>一、创建一个项目</h2><ol><li><p>在python中安装django库:<code>pip install django</code></p><p>默认安装的是最新的发行版,现已更新至4.0+,和网络中的2.0+相比,3.0时增添了asgi作为wsgi的异步处理版本,支持asyncio等异步的库</p></li><li><p>创建项目文件:在控制台中输入<code>django-admin startproject <项目名></code></p><p>则创建对应项目,并且项目结构如下(假定项目名称为<code>mysite</code>):</p><pre class="line-numbers language-none"><code class="language-none">mysite: # 项目文件夹 - mysite: # 配置文件夹 - __init__.py # 初始化文件,告诉 Python 该目录是一个 Python 包 - asgi.py # 异步服务器网关接口 - sttings.py # 配置文件 - urls.py # 路由文件,一份由 Django 驱动的网站"目录" - wsgi.py # 同步服务器网关接口 - manage.py # 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></li><li><p>运行项目:切换到<code>manage.py</code>文件对应的文件夹目录后,运行<code>python manage.py runserver</code>,此时服务被默认部署在<code>127.0.0.1:8000</code>,如需更改,则在前面的命令末尾加上运行的地址(ip和端口)</p><p>此时会发现,运行报错:<code>DJANGO.CORE.EXCEPTIONS.IMPROPERLYCONFIGURED: SQLITE 3.9.0 OR LATER IS REQUIRED (FOUND 3.x.x). </code>,这说明默认的sqlite数据库的版本不支持当前的django框架版本,此时要想成功运行有以下三个选择:</p><ul><li>降低django版本,即在安装django的时候指定版本号</li><li>升级sqlite(win系统中较为复杂)</li><li>更换默认数据库</li></ul><p>这里采用是第三种方法,更换默认数据库为mysql,需要安装python控制mysql的库并在配置文件中进行更改:</p><ul><li><p>python 3.x中控制mysql的库为<code>pymysql</code>,安装这个库</p></li><li><p>更改如下配置文件:</p><ul><li><p>在<code>__init__.py中</code>加入:</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> pymysqlpymysql<span class="token punctuation">.</span>install_as_MySQLdb<span class="token punctuation">(</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>因为在python2.x中,控制mysql的库是mysqldb,但是3.x中不再使用这个库了,需要适配</p></li><li><p>在<code>settings.py</code>中,更改DATABASES项为:</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token string">'default'</span><span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token string">'ENGINE'</span><span class="token punctuation">:</span> <span class="token string">'django.db.backends.mysql'</span><span class="token punctuation">,</span> <span class="token comment"># 固定配置</span> <span class="token string">'HOST'</span><span class="token punctuation">:</span> <span class="token string">'127.0.0.1'</span><span class="token punctuation">,</span> <span class="token comment"># mysql地址</span> <span class="token string">'PORT'</span><span class="token punctuation">:</span> <span class="token string">'3306'</span><span class="token punctuation">,</span> <span class="token comment"># 端口号</span> <span class="token string">'NAME'</span><span class="token punctuation">:</span> <span class="token string">'django'</span><span class="token punctuation">,</span> <span class="token comment"># 库名(组名)</span> <span class="token string">'USER'</span><span class="token punctuation">:</span> <span class="token string">'root'</span><span class="token punctuation">,</span> <span class="token comment"># 你的用户名,一般默认是root</span> <span class="token string">'PASSWORD'</span><span class="token punctuation">:</span> <span class="token string">'123456'</span><span class="token punctuation">,</span> <span class="token comment"># 你root账户的密码</span> <span class="token string">'OPTIONS'</span><span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token string">'init_command'</span><span class="token punctuation">:</span> <span class="token string">"SET sql_mode='STRICT_TRANS_TABLES'"</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>原来的默认配置是:</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token string">'default'</span><span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token string">'ENGINE'</span><span class="token punctuation">:</span> <span class="token string">'django.db.backends.sqlite3'</span><span class="token punctuation">,</span> <span class="token string">'NAME'</span><span class="token punctuation">:</span> BASE_DIR <span class="token operator">/</span> <span class="token string">'db.sqlite3'</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><p>可以注释掉</p></li></ul></li><li><p>执行以下命令进行数据迁移:</p><ul><li><code>python manage.py makemigrations </code> </li><li><code>python manage.py migrate</code></li></ul></li></ul></li><li><p>重新运行项目,在浏览器输入对应部署网址后看到初始界面表示项目创建成功:</p><p><img "" class="lazyload placeholder" data-original="/2022/01/26/Django%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%80%EF%BC%89/success_page.png" src="https://img10.360buyimg.com/ddimg/jfs/t1/157667/29/9156/134350/603c6445Ebbc9cabe/41219c5d36d45072.gif" alt="success_page"></p></li></ol><h2 id="二、路由管理初步-amp-请求响应——HelloWorld"><a href="#二、路由管理初步-amp-请求响应——HelloWorld" class="headerlink" title="二、路由管理初步&请求响应——HelloWorld"></a>二、路由管理初步&请求响应——HelloWorld</h2><p>在项目中输出一个“HelloWorld”,需要通过配置相应的路由和对应的方法来完成</p><ol><li><p>在项目配置文件的目录中创建一个新文件<code>views.py</code>(固定名称),并进行如下配置:</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">from</span> django<span class="token punctuation">.</span>http <span class="token keyword">import</span> HttpResponse <span class="token keyword">def</span> <span class="token function">hello</span><span class="token punctuation">(</span>request<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment"># 接受一个请求</span> <span class="token keyword">return</span> HttpResponse<span class="token punctuation">(</span><span class="token string">"Hello world ! "</span><span class="token punctuation">)</span> <span class="token comment"># 返回一个响应</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre></li><li><p>在<code>urls.py</code>文件中进行配置,导入刚才创建的views文件并对urlpatterns列表进行添加:</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">from</span> <span class="token punctuation">.</span> <span class="token keyword">import</span> views <span class="token comment"># 添加这条导入信息</span><span class="token triple-quoted-string string">'''这是原来的urlpatternsurlpatterns = [ path('admin/', admin.site.urls),]'''</span><span class="token comment"># 新的urlpatterns</span>urlpatterns <span class="token operator">=</span> <span class="token punctuation">[</span> path<span class="token punctuation">(</span><span class="token string">'admin/'</span><span class="token punctuation">,</span> admin<span class="token punctuation">.</span>site<span class="token punctuation">.</span>urls<span class="token punctuation">)</span><span class="token punctuation">,</span> path<span class="token punctuation">(</span><span class="token string">'hello/'</span><span class="token punctuation">,</span> views<span class="token punctuation">.</span>hello<span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token punctuation">]</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>此时开启服务器,并在浏览器网址栏输入<code>127.0.0.1:8000/hello/</code>,可以看到如下结果:</p><p><img "" class="lazyload placeholder" data-original="/2022/01/26/Django%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%80%EF%BC%89/hello_page.png" src="https://img10.360buyimg.com/ddimg/jfs/t1/157667/29/9156/134350/603c6445Ebbc9cabe/41219c5d36d45072.gif" alt="hello_page.png"></p></li><li><p>关于路由配置:</p><ul><li><code>path(route, view, kwargs=None, name=None)</code>方法:四个参数<ul><li>route: 字符串,表示 URL 规则,与之匹配的 URL 会执行对应的第二个参数 view。</li><li>view: 用于执行与正则表达式匹配的 URL 请求。</li><li>kwargs: 视图使用的字典类型的参数。</li><li>name: 用来反向获取 URL。</li></ul></li><li><code>re_path(route, view, kwargs=None, name=None)</code>方法,四个参数同上,用来匹配使用正则表达式的URL</li></ul></li></ol><h2 id="三、后台管理初步"><a href="#三、后台管理初步" class="headerlink" title="三、后台管理初步"></a>三、后台管理初步</h2><ol><li><p>通过<code>manage.py</code>创建超级管理员用户:<code>python manage.py createsuperuser</code></p><p>然后依次输入用户名和密码即可,中间的邮箱可以略过</p><p><img "" class="lazyload placeholder" data-original="/2022/01/26/Django%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%80%EF%BC%89/create_superuser.png" src="https://img10.360buyimg.com/ddimg/jfs/t1/157667/29/9156/134350/603c6445Ebbc9cabe/41219c5d36d45072.gif" alt="create_superuser"></p><p>这里选择用户名为<code>admin</code>,同时设定了密码也是admin,系统提示密码和用户名过于相似而且太短(少于8位),而且密码太简单,但是下面选择<code>y</code>表示仍然这样设置,则超级用户设置成功。</p></li><li><p>运行服务,在浏览器输入<code>127.0.0.1:8000/admin/</code>即可打开后台管理的登录页面:</p><p><img "" class="lazyload placeholder" data-original="/2022/01/26/Django%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%80%EF%BC%89/backend_login.png" src="https://img10.360buyimg.com/ddimg/jfs/t1/157667/29/9156/134350/603c6445Ebbc9cabe/41219c5d36d45072.gif" alt="backend_login"></p><p>输入用户名和密码,进入后台:</p><p><img "" class="lazyload placeholder" data-original="/2022/01/26/Django%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%80%EF%BC%89/backend.png" src="https://img10.360buyimg.com/ddimg/jfs/t1/157667/29/9156/134350/603c6445Ebbc9cabe/41219c5d36d45072.gif" alt="backend"></p><p>发现这里有一个用户,就是刚才创建的<code>admin</code></p></li></ol><h2 id="四、创建应用(APP)"><a href="#四、创建应用(APP)" class="headerlink" title="四、创建应用(APP)"></a>四、创建应用(APP)</h2><p>APP是Django框架中功能模块实现的部分,我们根据需要的功能来创建和设置不同的APP来进行使用。APP中有模型(Models)和视图(Views),是需要我们重点关注的部分。</p><h3 id="1-通过manage-py创建APP:python-manage-py-startapp-lt-名称-gt"><a href="#1-通过manage-py创建APP:python-manage-py-startapp-lt-名称-gt" class="headerlink" title="1. 通过manage.py创建APP:python manage.py startapp <名称>"></a>1. 通过<code>manage.py</code>创建APP:<code>python manage.py startapp <名称></code></h3><p>这里创建了一个名为<code>article</code>的APP用来发布文章</p><p>此时,在我们的项目文件夹中出现了新的文件夹,就是刚创建的app的文件夹,因此整个项目的文件树变成了以下情况:</p><pre class="line-numbers language-none"><code class="language-none">mysite: # 项目文件夹 - mysite: # 配置文件夹 - __init__.py # 初始化文件,告诉 Python 该目录是一个 Python 包 - asgi.py # 异步服务器网关接口 - sttings.py # 配置文件 - urls.py # 路由文件,一份由 Django 驱动的网站"目录" - views.py # 在步骤二中创建的文件,表示视图,即用户看到的界面,也是URL对应的方法 - wsgi.py # 同步服务器网关接口 - article: # 刚刚创建的APP的文件夹 - __init__.py - admin.py # APP的后台管理文件,如需通过后台向数据库中添加数据,可以进行操作 - apps.py # APP的启动类 - migrations # 数据库表、字段等变更的记录 - models.py # 持久层,对数据库进行操作 - tests.py # 单元测试 - views.py # 视图,与配置文件夹中的作用一样 - manage.py # 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="2-在全局设置中注册APP:"><a href="#2-在全局设置中注册APP:" class="headerlink" title="2. 在全局设置中注册APP:"></a>2. 在全局设置中注册APP:</h3><p>找到配置文件夹,修改其中的<code>settings.py</code>中<code>INSTALLED_APPS</code>字段,并在列表中添加上我们创建的APP。这里可以打开<code>article</code>文件夹下的<code>apps.py</code>文件,看到里面有一个类叫做<code>ArticleConfig</code>,里面保存了我们这个APP的配置,因此,我们在<code>INSTALLED_APPS</code>列表中添加<code>'article.apps.ArticleConfig',</code>就可以了(逗号也要添加进去)。</p><h3 id="3-创建一个简单的文章模型,并通过后台添加数据:"><a href="#3-创建一个简单的文章模型,并通过后台添加数据:" class="headerlink" title="3. 创建一个简单的文章模型,并通过后台添加数据:"></a>3. 创建一个简单的文章模型,并通过后台添加数据:</h3><ol><li><p>首先在article的<code>models.py</code>中写入以下内容并保存:</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">class</span> <span class="token class-name">Article</span><span class="token punctuation">(</span>models<span class="token punctuation">.</span>Model<span class="token punctuation">)</span><span class="token punctuation">:</span> title <span class="token operator">=</span> models<span class="token punctuation">.</span>CharField<span class="token punctuation">(</span>max_length<span class="token operator">=</span><span class="token number">30</span><span class="token punctuation">)</span> <span class="token comment"># 设置一个属性为标题,对应数据库中的字符型,最大长度为30</span> content <span class="token operator">=</span> models<span class="token punctuation">.</span>TextField<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># 设置内容属性,对应数据库中的文本型</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></li><li><p>进行数据库更新:</p><ul><li><code>python manage.py makemigrations </code> </li><li><code>python manage.py migrate</code></li></ul></li><li><p>进行后台注册:</p><p>在article的<code>admin.py</code>中添加以下内容:</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token comment"># 前面有文件自带的一些import信息,不用修改,直接添加以下内容即可</span><span class="token keyword">from</span> <span class="token punctuation">.</span>models <span class="token keyword">import</span> Articleadmin<span class="token punctuation">.</span>site<span class="token punctuation">.</span>register<span class="token punctuation">(</span>Article<span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre></li><li><p>打开后台,发现已经有了Article:</p><p><img "" class="lazyload placeholder" data-original="/2022/01/26/Django%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%80%EF%BC%89/backend_article.png" src="https://img10.360buyimg.com/ddimg/jfs/t1/157667/29/9156/134350/603c6445Ebbc9cabe/41219c5d36d45072.gif"></p><p>添加3个数据:</p><p><img "" class="lazyload placeholder" data-original="/2022/01/26/Django%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%80%EF%BC%89/add_articles.png" src="https://img10.360buyimg.com/ddimg/jfs/t1/157667/29/9156/134350/603c6445Ebbc9cabe/41219c5d36d45072.gif"></p></li></ol><h3 id="4-(可选)将后台改为中文界面:"><a href="#4-(可选)将后台改为中文界面:" class="headerlink" title="4. (可选)将后台改为中文界面:"></a>4. (可选)将后台改为中文界面:</h3><p>将配置文件夹的<code>settings.py</code>中的<code>LANGUAGE_CODE</code>改为<code>zh-hans</code></p><p><img "" class="lazyload placeholder" data-original="/2022/01/26/Django%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%80%EF%BC%89/chinese_backend.png" src="https://img10.360buyimg.com/ddimg/jfs/t1/157667/29/9156/134350/603c6445Ebbc9cabe/41219c5d36d45072.gif"></p><h2 id="五、模板的创建和使用"><a href="#五、模板的创建和使用" class="headerlink" title="五、模板的创建和使用"></a>五、模板的创建和使用</h2><p>模板(Template)是为了方便同质化网页的部署而使用的,比如一般的个人博客,其每篇文章的页面都可能用的是一个html模板,只是标题和显示的内容不同,这里的html文件就是模板。我们在Django中可以自己制作或放置模板,来进行网页的批量处理。</p><h3 id="1-模板文件夹的位置和创建模板:"><a href="#1-模板文件夹的位置和创建模板:" class="headerlink" title="1. 模板文件夹的位置和创建模板:"></a>1. 模板文件夹的位置和创建模板:</h3><p>我们首先可以查看配置文件夹中的<code>setings.py</code>文件,找到<code>TEMPLATES</code>,默认情况下,其中<code>DIRS</code>为空列表,而<code>APP_DIRS</code>为<code>True</code>表示在寻找模板文件时,会去APP文件夹内的模板文件夹找。</p><p>当<code>DIRS</code>为空时,项目文件夹中即使有<code>templates</code>文件夹,也不会优先去这里找模板文件,会按照<code>settings.py</code>中的注册顺序,从每个APP的<code>templates</code>文件夹找,只要找到对应名称的文件就会返回。</p><p>此时,我们可以先在article文件夹下创建<code>templates</code>,并创建一个模板<code>article_detail.html</code></p><p>内容如下:</p><pre class="line-numbers language-html" data-language="html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>html</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>head</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>head</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>body</span><span class="token punctuation">></span></span> <span class="token comment"><!-- 这里用双大括号标出变量,因为传来的article_obj是一个对象, 有title和content两个属性,可以直接调用 --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h2</span><span class="token punctuation">></span></span>{{article_obj.title}}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h2</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>{{article_obj.content}}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>body</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>html</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="2-视图配置和路由管理"><a href="#2-视图配置和路由管理" class="headerlink" title="2. 视图配置和路由管理"></a>2. 视图配置和路由管理</h3><ol><li><p>视图配置:</p><p>在article文件夹的<code>views.py</code>中添加一个方法和对应的依赖:</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">from</span> django<span class="token punctuation">.</span>shortcuts <span class="token keyword">import</span> get_object_or_404 <span class="token comment"># 这个函数如果能查到就获取,差不到就抛出404异常</span><span class="token keyword">from</span> <span class="token punctuation">.</span>models <span class="token keyword">import</span> Article<span class="token keyword">def</span> <span class="token function">article_detail</span><span class="token punctuation">(</span>request<span class="token punctuation">,</span> article_id<span class="token punctuation">)</span><span class="token punctuation">:</span> article <span class="token operator">=</span> get_object_or_404<span class="token punctuation">(</span>Article<span class="token punctuation">,</span> <span class="token builtin">id</span><span class="token operator">=</span>article_id<span class="token punctuation">)</span> <span class="token comment"># 传入模型,数据库按传入的id进行查找</span> content <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token comment"># 一个内容字典,字典的键对应的就是html模板中的变量名</span> content<span class="token punctuation">[</span><span class="token string">"article_obj"</span><span class="token punctuation">]</span> <span class="token operator">=</span> article <span class="token keyword">return</span> render<span class="token punctuation">(</span>request<span class="token punctuation">,</span> <span class="token string">'article_detail.html'</span><span class="token punctuation">,</span> content<span class="token punctuation">)</span> <span class="token comment"># 传入request,模板,内容字典</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></li><li><p>路由管理:</p><p>在配置文件夹的<code>urls.py</code>中添加一条路由解析记录:</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">from</span> article<span class="token punctuation">.</span>views <span class="token keyword">import</span> article_detail path<span class="token punctuation">(</span><span class="token string">'article/<int:article_id>'</span><span class="token punctuation">,</span> article_detail<span class="token punctuation">,</span> name<span class="token operator">=</span><span class="token string">'article_detail'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment"># 路由是article/int的部分全都用一个方法处理</span><span class="token comment"># article_id就是url中出现的数字</span><span class="token comment"># name用来标记这个路由,是它的别名</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></li><li><p>运行服务:</p><p><img "" class="lazyload placeholder" data-original="/2022/01/26/Django%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%80%EF%BC%89/article_page.png" src="https://img10.360buyimg.com/ddimg/jfs/t1/157667/29/9156/134350/603c6445Ebbc9cabe/41219c5d36d45072.gif"></p><p>如果没有这个数据:</p><p><img "" class="lazyload placeholder" data-original="/2022/01/26/Django%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%80%EF%BC%89/article_notfound.png" src="https://img10.360buyimg.com/ddimg/jfs/t1/157667/29/9156/134350/603c6445Ebbc9cabe/41219c5d36d45072.gif"></p></li></ol><h3 id="3-通过模板获取文章列表"><a href="#3-通过模板获取文章列表" class="headerlink" title="3. 通过模板获取文章列表"></a>3. 通过模板获取文章列表</h3><ol><li><p>在APP文件夹的<code>templates</code>目录下创建一个新的模板文件<code>article_list.html</code>:</p><pre class="line-numbers language-html" data-language="html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>html</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>head</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>head</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>body</span><span class="token punctuation">></span></span> {% for article in articles %} <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{% url <span class="token punctuation">'</span>article_detail<span class="token punctuation">'</span> article.id %}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{{ article.title }}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span> {% endfor %} <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>body</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>html</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><ul><li><p>其中,<code>{% for %}{% endfor %}</code>是Django的模板标签,可以将一个QuerySet遍历出来,如果这里不用for标签,直接,就会在页面上显示一个QuerySet的对象,而不是需要的列表。</p></li><li><p>而<code>{% url %}</code>也是Django的模板标签,负责查找路由配置</p><p><code>{% url <name> [<para1> , <para2>, ...]}` 这表明了`{% url %}</para2></para1></name></code>标签的第一个参数就是路由配置中path(或re_path)函数中的name参数对应的值,从而将链接指定为这个路由;剩下的参数则是可选的,根据路由中的参数,按顺序填写。上文代码块中的<code>article.id</code>对应的就是其路由配置中<code>article/<int:article_id></code>的<code>article_id</code></p></li><li><p><code><li></code>标签和<code><a></code>标签都是html的基本标签</p></li></ul></li><li><p>在APP文件夹下的<code>views.py</code>中添加一个新的方法如下:</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">article_list</span><span class="token punctuation">(</span>request<span class="token punctuation">)</span><span class="token punctuation">:</span> articles <span class="token operator">=</span> Article<span class="token punctuation">.</span>objects<span class="token punctuation">.</span><span class="token builtin">all</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># 获取所有Article对象</span> content <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> content<span class="token punctuation">[</span><span class="token string">"articles"</span><span class="token punctuation">]</span> <span class="token operator">=</span> articles <span class="token keyword">return</span> render<span class="token punctuation">(</span>request<span class="token punctuation">,</span> <span class="token string">'article_list.html'</span><span class="token punctuation">,</span> content<span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>由此,html模板文件中的变量就是<code>articles</code>,这是查到的Article对象的查询集合(QuerySet)</p></li><li><p>在配置文件夹的<code>urls.py</code>中配置路由如下:</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">from</span> article<span class="token punctuation">.</span>views <span class="token keyword">import</span> article_listpath<span class="token punctuation">(</span><span class="token string">'article/'</span><span class="token punctuation">,</span> article_list<span class="token punctuation">,</span> name<span class="token operator">=</span><span class="token string">'article_list'</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></li><li><p>运行服务,打开<code>127.0.0.1:8000/article/</code>:</p><p><img "" class="lazyload placeholder" data-original="/2022/01/26/Django%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%80%EF%BC%89/article_list.png" src="https://img10.360buyimg.com/ddimg/jfs/t1/157667/29/9156/134350/603c6445Ebbc9cabe/41219c5d36d45072.gif"></p><p>证明配置成功了</p></li><li><p>再看<code>{% url %}</code>标签:</p><p>由此我们就可以发现,url标签的使用正是通过如上3步进行配置的,每一步都互相影响。</p><p>此外,这里选择使用看起来很复杂的<code>{% url %}</code>标签,而不是直接配置成<code><a href="article/{{ article,id }}"></a></code>,是因为如果不用url标签,一旦路由配置中的对应项路由进行了修改,所有使用这个路由的地方都需要重新改变;而使用url标签就可以大大简化这个过程,进一步解耦合。</p></li></ol><h2 id="六、路由管理进阶——通过总路由管理每个APP的路由"><a href="#六、路由管理进阶——通过总路由管理每个APP的路由" class="headerlink" title="六、路由管理进阶——通过总路由管理每个APP的路由"></a>六、路由管理进阶——通过总路由管理每个APP的路由</h2><p>创建APP的路由文件:</p><p>在article文件夹下创建<code>urls.py</code>,并将总路由配置文件(配置文件夹下的<code>urls.py</code>)中与article有关的部分剪切到APP的路由配置文件中,得到<strong>APP的路由配置</strong>如下:</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">from</span> django<span class="token punctuation">.</span>urls <span class="token keyword">import</span> path<span class="token keyword">from</span> <span class="token punctuation">.</span> <span class="token keyword">import</span> views <span class="token comment"># 这里是article的views</span>urlpatterns <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token comment"># 此时这里的路由地址已经是"127.0.0.1:8000/article"了</span> path<span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">,</span> views<span class="token punctuation">.</span>article_list<span class="token punctuation">,</span> name<span class="token operator">=</span><span class="token string">'article_list'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> path<span class="token punctuation">(</span><span class="token string">'<int:article_id>'</span><span class="token punctuation">,</span> views<span class="token punctuation">.</span>article_detail<span class="token punctuation">,</span> name<span class="token operator">=</span><span class="token string">'article_detail'</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token punctuation">]</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>同时,将<strong>总路由配置文件</strong>改为:</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">from</span> django<span class="token punctuation">.</span>contrib <span class="token keyword">import</span> admin<span class="token keyword">from</span> django<span class="token punctuation">.</span>urls <span class="token keyword">import</span> path<span class="token punctuation">,</span> include <span class="token comment"># include是为了管理APP中的路由,引入的函数</span><span class="token keyword">from</span> <span class="token punctuation">.</span> <span class="token keyword">import</span> views <span class="token comment"># 配置文件夹下的views</span>urlpatterns <span class="token operator">=</span> <span class="token punctuation">[</span> path<span class="token punctuation">(</span><span class="token string">'admin/'</span><span class="token punctuation">,</span> admin<span class="token punctuation">.</span>site<span class="token punctuation">.</span>urls<span class="token punctuation">)</span><span class="token punctuation">,</span> path<span class="token punctuation">(</span><span class="token string">'hello/'</span><span class="token punctuation">,</span> views<span class="token punctuation">.</span>hello<span class="token punctuation">)</span><span class="token punctuation">,</span> path<span class="token punctuation">(</span><span class="token string">'article/'</span><span class="token punctuation">,</span> include<span class="token punctuation">(</span><span class="token string">'article.urls'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment"># 表示只要路由是article/xxx的部分全都由article的urls进行处理</span><span class="token punctuation">]</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="七、静态资源"><a href="#七、静态资源" class="headerlink" title="七、静态资源"></a>七、静态资源</h2><p>在开发过程中,一般将:</p><ul><li>图片</li><li>CSS</li><li>js</li><li>插件</li></ul><p>当做静态文件处理。</p><p>静态文件的文件夹默认名称是<code>static</code>,<code>static</code>的标准目录格式是:</p><pre class="line-numbers language-none"><code class="language-none">- static- img- CSS- js- plugins<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>一般会将<code>static</code>放在对应的APP文件夹下,在html模板中引用对应位置的资源是,需要使用<code>{% static %}</code>标签引用:</p><pre class="line-numbers language-html" data-language="html"><code class="language-html">{% load static %} <span class="token comment"><!-- 如果下面用{% static %}标签,则在模板开头需要使用这个标签加载资源 --></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>img</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{% static <span class="token punctuation">'</span>img/1.png<span class="token punctuation">'</span> %}<span class="token punctuation">"</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><p>静态文件的设置在配置文件夹下的<code>settings.py</code>文件中有对应的配置。</p><h2 id="八、请求和相应"><a href="#八、请求和相应" class="headerlink" title="八、请求和相应"></a>八、请求和相应</h2><p>这一部分主要是处理用户发来的请求并向用户返回响应的过程。</p><h3 id="请求"><a href="#请求" class="headerlink" title="请求"></a>请求</h3><ul><li><p>请求的方式:GET/POST</p><p>在视图中获取请求:每个视图的函数的参数都是request,其中就包含了用户提交的所有请求信息。通过<code>reuqest.method</code>我们可以获取到用户请求的方式。</p></li><li><p>GET请求:直接在URL上传递参数</p><p>在URL的末尾增加”?n1=xxx&n2=xx”,通过<code>request.GET</code>就可以获取到传递参数的字典</p></li><li><p>POST请求会发送一个请求体,通过<code>request.POST</code>获得请求体的数据</p></li></ul><h3 id="响应"><a href="#响应" class="headerlink" title="响应"></a>响应</h3><ul><li>简单的响应——直接返回字符串<code>HTttpResponse(str)</code>,如果这里的字符串符合html格式,也会被自动变成对应的样式</li><li>结合htnml模板的响应——<code>render()</code></li><li>重定向响应——<code>redirect(new_url)</code>,收到这个响应的用户会对新的url发起请求</li></ul><h3 id="表单机制"><a href="#表单机制" class="headerlink" title="表单机制"></a>表单机制</h3><p>在html中设置表单时,注意django的csrf_token机制,需要加上<code>{% csrf_token %}</code>标签</p><pre class="line-numbers language-html" data-language="html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>form</span> <span class="token attr-name">method</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>post<span class="token punctuation">"</span></span> <span class="token attr-name">action</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/login/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> {% csrf_token %} <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>username<span class="token punctuation">"</span></span> <span class="token attr-name">placeholder</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>用户名<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>password<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>pwd<span class="token punctuation">"</span></span> <span class="token attr-name">placeholder</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>密码<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>submit<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>提交<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>form</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>同时在对应的路由的视图函数中,可以根据请求方法的不同,做出不同的响应(如果只是GET,就返回登录页面;如果是POST,就解析提交的用户名和密码,进行验证,返回结果)</p><h2 id="九、数据库操作"><a href="#九、数据库操作" class="headerlink" title="九、数据库操作"></a>九、数据库操作</h2><p>django自带了ORM,可以帮助我们对数据库操作,因此我们只要学习django的ORM就可以完成对数据库的操作了。</p><p>django可以对数据库的操作有:</p><ul><li>创建、删除、修改表(table)</li><li>对表中的数据进行增删改查</li></ul><h3 id="创建和修改表、字段"><a href="#创建和修改表、字段" class="headerlink" title="创建和修改表、字段"></a>创建和修改表、字段</h3><p>在APP文件夹下的<code>models.py</code>中进行修改,并进行数据库迁移的两条指令:</p><p>只要在这个文件中,写了继承了<code>models.Model</code>的类,django就会帮我们在数据库中创建<code><app名_小写类名></code>的表。如上文中写过的:</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">class</span> <span class="token class-name">Article</span><span class="token punctuation">(</span>models<span class="token punctuation">.</span>Model<span class="token punctuation">)</span><span class="token punctuation">:</span> title <span class="token operator">=</span> models<span class="token punctuation">.</span>CharField<span class="token punctuation">(</span>max_length<span class="token operator">=</span><span class="token number">30</span><span class="token punctuation">)</span> <span class="token comment"># 设置一个属性为标题,对应数据库中的字符型,最大长度为30</span> content <span class="token operator">=</span> models<span class="token punctuation">.</span>TextField<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># 设置内容属性,对应数据库中的文本型</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><p>此时,因为我们的APP叫做<code>article</code>,所以MySQL数据库中,就创建了<code>article_article</code>的表,并创建了<code>title</code>和<code>content</code>字段。</p><p>如果此时需要删除旧字段,则直接在类中删去对应属性,并进行数据库迁移即可;如果需要添加新的字段,考虑到数据库可能原有数据,此时需要为新字段<strong>设置默认值或允许为空</strong>。</p><ul><li><p>设置默认值:<code>data = models.TextField(default="hello")</code></p></li><li><p>允许为空: <code>data = models.TextField(null=True, blank=True)</code></p></li></ul><p><strong>注意:每次调整了<code>models.py</code>后都需要执行两条数据库迁移的命令</strong></p><h3 id="表中数据的增删改查"><a href="#表中数据的增删改查" class="headerlink" title="表中数据的增删改查"></a>表中数据的增删改查</h3><p>先从<code>models.py</code>中导入模型类,使用类方法进行增删改查,这里以上面的<code>Article</code>为例</p><ul><li><p>查询</p><ul><li><p>获取所有数据</p><pre class="line-numbers language-python" data-language="python"><code class="language-python">datas <span class="token operator">=</span> Article<span class="token punctuation">.</span>objects<span class="token punctuation">.</span><span class="token builtin">all</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># 得到的是一个QuerySet类型的对象</span><span class="token comment"># 遍历这个对象,会得到<Article: Article object (1)> ...,即为实际查到的一行数据</span><span class="token comment"># 每行数据显示的名称可以通过改变模型类中的__str__方法实现</span><span class="token comment"># 获取数据的分量(不同字段的对应值),可以通过访问属性的方法实现</span><span class="token comment"># 如: data.first().title first()方法是取出QuerySet的第一个数据</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre></li><li><p>获取筛选后的数据</p><pre class="line-numbers language-python" data-language="python"><code class="language-python">data <span class="token operator">=</span> Article<span class="token punctuation">.</span>objects<span class="token punctuation">.</span><span class="token builtin">filter</span><span class="token punctuation">(</span><span class="token builtin">id</span><span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">.</span>first<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token comment"># 因为即使只查到了返回的也是QuerySet还需要用first()</span><span class="token comment"># 这里限制了返回的对象的id为1</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></li></ul></li><li><p>添加数据</p><pre class="line-numbers language-python" data-language="python"><code class="language-python">Article<span class="token punctuation">.</span>objects<span class="token punctuation">.</span>create<span class="token punctuation">(</span>title<span class="token operator">=</span><span class="token string">"four"</span><span class="token punctuation">,</span> content <span class="token operator">=</span> <span class="token string">"article four"</span><span class="token punctuation">)</span><span class="token comment"># 直接添加一条新数据,没写到的字段必须是有默认值或者允许为空的</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></li><li><p>删除数据</p><ul><li><p>删除指定数据</p><pre class="line-numbers language-none"><code class="language-none">Article.objects.filter(id=1).delete() # 删除所有id为1的数据<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></li><li><p>删除所有数据</p><pre class="line-numbers language-python" data-language="python"><code class="language-python">Article<span class="token punctuation">.</span>objects<span class="token punctuation">.</span><span class="token builtin">all</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>delete<span class="token punctuation">(</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></li></ul></li><li><p>更新数据</p><ul><li><p>更新所有数据的分量</p><pre class="line-numbers language-python" data-language="python"><code class="language-python">Article<span class="token punctuation">.</span>objects<span class="token punctuation">.</span><span class="token builtin">all</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>update<span class="token punctuation">(</span>title<span class="token operator">=</span><span class="token string">"None"</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></li><li><p>更新特定数据的分量</p><pre class="line-numbers language-python" data-language="python"><code class="language-python">Article<span class="token punctuation">.</span>objects<span class="token punctuation">.</span><span class="token builtin">filter</span><span class="token punctuation">(</span><span class="token builtin">id</span><span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">.</span>update<span class="token punctuation">(</span>title<span class="token operator">=</span><span class="token string">"None"</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></li></ul></li></ul>]]></content>
<tags>
<tag> Python </tag>
<tag> 学习笔记 </tag>
<tag> Django </tag>
</tags>
</entry>
<entry>
<title>智能合约与Solidity学习(一)</title>
<link href="/2021/08/15/%E6%99%BA%E8%83%BD%E5%90%88%E7%BA%A6%E4%B8%8ESolidity%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%B8%80%EF%BC%89/"/>
<url>/2021/08/15/%E6%99%BA%E8%83%BD%E5%90%88%E7%BA%A6%E4%B8%8ESolidity%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%B8%80%EF%BC%89/</url>
<content type="html"><![CDATA[<h1 id="智能合约与Solidity学习心得(一)"><a href="#智能合约与Solidity学习心得(一)" class="headerlink" title="智能合约与Solidity学习心得(一)"></a><center>智能合约与Solidity学习心得(一)</center></h1><h2 id="一、起源"><a href="#一、起源" class="headerlink" title="一、起源"></a>一、起源</h2><p>智能合约(Smart Contract),顾名思义,是具有“智能”的合约。所谓智能,是可以自动实现一定的功能;所谓合约,就是一种标准或规则用以约束和规范一些行为。智能合约的概念很早就被提出,但是这个概念在近些年来才广为流传,并且作为区块链的伴生概念,有了新的意义。智能合约部署的一个较为知名的案例就是以太坊(Ethereum)。那么下面我们首先来看一下,什么是区块链和以太坊。</p><h3 id="区块链与以太坊"><a href="#区块链与以太坊" class="headerlink" title="区块链与以太坊"></a>区块链与以太坊</h3><h4 id="区块链"><a href="#区块链" class="headerlink" title="区块链"></a>区块链</h4><p>区块链(Blockchain)起源于2008年的一篇论文《比特币:一种点对点的电子现金系统》,作者化名为中本聪。在这篇文章中,中本聪先生根据现有的<strong>P2P技术</strong>、<strong>加密技术</strong>等,提出了区块链的概念,并以这些技术开发了一种数字货币——<strong>比特币</strong>的交易系统。</p><p>区块链技术从本质上讲实可以分为区块(block)和链(chain)两大部分,区块作为记录交易(transaction)的载体,将区块连接成链就成为了区块链。</p><p>区块链的主要特点是:</p><ul><li><p>去中心化</p><p>去中心化是与中心化相对的概念,像我们平常使用的一些系统,绝大多数是中心化的,其中的信息由我们信任的企业或组织进行保管,如银行的交易记录,个人的身份信息等。而去中心化就是不存在上述的机构专门存储信息,而是由每个参与者进行信息的存储,这样一来,当参与者足够多的时候,少数谬误在“对账”的过程中被纠正。比特币交易系统作为区块链的首个应用者就采用了这种方式进行信息记录。</p></li><li><p>共识机制</p><p>共识机制就是达成共识的方式。由于区块链是去中心化的,也就是说没有一个共同的信任单位有“权威”领导大家,所以在这样的系统中,每笔交易的达成都需要通过共识机制来进行完成。常见的共识机制如下:</p><ul><li>工作量证明机制(PoW)</li><li>权益证明机制(PoS)</li><li>股份授权证明机制(DPoS)</li></ul><p>这里以比特币交易系统为例,解释比特币交易系统中的共识机制——工作量证明机制。上文中提到,每笔交易的达成需要通过共识机制,同时,每笔交易都将记录在区块之中,因此“记账”这个行为的产生需要达成共识机制。比特币交易系统采用的是PoW,就是通过计算随机哈希散列的数值来进行记账,最先计算出的参与者可以进行“记账”,这需要很大的计算资源。那么这些参与者为什么要争抢记账权呢,原因就是记账的人将被奖励比特币,这也是比特币产生的方式。</p><p>所以总而言之,比特币交易系统通过奖励比特币的方式激励参与者争抢记账权,而记账权争抢的规则就是进行大量的计算,一般而言,算力越大的一方就更有可能抢到记账权,其工作量也就越大,因此这种方式叫工作量证明机制,而争抢记账权的规则,就是<strong>共识机制</strong>。</p></li><li><p>智能合约</p><p>在初始的比特币系统中,智能合约的概念还不明显,因此我们将在下文介绍以太坊时,以以太坊为例介绍智能合约。</p></li></ul><h4 id="以太坊"><a href="#以太坊" class="headerlink" title="以太坊"></a>以太坊</h4><p>由于比特币的交易系统仅支持简单的P2P加密交易的过程,即付款方向收款方的加密钱包中发送一定数量的比特币,其中的身份认证环节是有比特币交易系统自带的一种脚本语言实现的,但这种脚本语言在比特币交易系统中仅仅用作支持这一种场景,由此产生了以太坊,作为一种新式交易的平台。</p><p>以太坊(Ethereum),是一个平台,为用户提供各种模块使得用户来搭建自己的应用,而以太坊上的“应用”,实质上就是智能合约。在以太坊上搭建的智能合约可以使得用户“自动化”进行购买,就像搭建了一台有规则的自动贩卖机一样。</p><p>由此可见,智能合约实质上就是一种人为制定的,部署在区块链上的用于自动处理交易或完成特定功能的可执行的程序。既然智能合约的本质是一种程序,就需要运行环境和一定的编程语言来编写。</p><h2 id="二、智能合约与Solidity"><a href="#二、智能合约与Solidity" class="headerlink" title="二、智能合约与Solidity"></a>二、智能合约与Solidity</h2><p>智能合约作为一段可以实现某种功能的程序,其最初被应用于以太坊,而在以太坊上运行的环境就是以太坊虚拟机(EVM),而实际进行编写智能合约的语言是Solidity。编译器通过编译Solidity源码,将其转换为能在EVM上运行的程序,在部署到EVM后,则可作为一种智能合约被使用。</p><p>实际上,我们可以通过 <code>Java</code> 语言进行类比理解。我们首先编写Java源码,然后通过编译器将其转换为<code>JavaClass</code>文件,并在<code>Java</code><strong>虚拟机</strong>(JVM)上进行运行。</p><p>一般来说,在本地部署EVM较为复杂,因此对于学习Solidity的人员,需要通过<a href="https://remix.ethereum.org/">Remix</a>来进行线上的学习和调试,在有一定的基础后,再进行本地的EVM部署等操作。</p><p>从下期开始将总结Solidity的学习心得,敬请期待♪(^∇^*)~~</p>]]></content>
<tags>
<tag> 区块链 </tag>
<tag> 智能合约 </tag>
<tag> 心得体会 </tag>
</tags>
</entry>
<entry>
<title>Hello World</title>
<link href="/2021/08/05/hello-world/"/>
<url>/2021/08/05/hello-world/</url>
<content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo new <span class="token string">"My New Post"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo server<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo generate<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo deploy<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
<tags>
<tag> 初始化 </tag>
<tag> 灌水 </tag>
</tags>
</entry>
</search>