Django 基础
<h2>Django5 入门</h2>
<h3>Django相关的网址</h3>
<p>Github源代码:<a href=“https://github.com/django/django”>https://github.com/django/django</a> </p>
<p>Django官网:<a href=“https://www.djangoproject.com/”>https://www.djangoproject.com/</a></p>
<h3>安装Django</h3>
<p>通过 <code>pip install django</code> 安装 <code>django</code> ,本文以 <code>Django 5.0.3</code> 版本进行记录。</p>
<pre><code class=“language-Python”>pip install django
#如需要指定版本用这个命令
pip install django==5.0.3
</code></pre>
<h3>初始化 Django 项目</h3>
<p>创建项目使用命令: <code>django-admin startproject [项目名称]</code> 即可创建。 </p>
<p>初始化一个新的 Django 项目,例如:</p>
<pre><code class=“language-text”>django-admin startproject startdjango
</code></pre>
<p>创建应用(app):一个项目类似于是一个架子,但是真正起作用的还是 <code>app</code> 。</p>
<p>在终端进入到项目所在的路径,然后执行 <code>python manage.py startapp [app名称]</code> 创建一个app。</p>
<h3>运行Django项目</h3>
<p>进入项目,通过命令行的方式: <code>python manage.py runserver</code> </p>
<p>这样可以在本地访问项目网站,默认端口号是 <code>8000</code> ,在浏览器中通过 <code>http://127.0.0.1:8000/</code> 来访问</p>
<pre><code class=“language-Bash”>cd startdjango
python manage.py runserver</code></pre>
<p>如果想要修改端口号,那么在运行的时候可以指定端口号,<code>python manage.py runserver 9000</code>这样就可以通过9000端口来访问</p>
<pre><code class=“language-Python”>python manage.py runserver 9000</code></pre>
<h3>项目结构介绍</h3>
<ol>
<li><code>manage.py</code>:以后和项目交互基本上都是基于这个文件。一般都是在终端输入<code>python manage.py [子命令]</code>。可以输入<code>python manage.py help</code>看下能做什么事情。除非你知道你自己在做什么,一般情况下不应该编辑这个文件。</li>
<li><code>settings.py</code>:本项目的设置项,以后所有和项目相关的配置都是放在这个里面。</li>
<li><code>urls.py</code>:这个文件是用来配置URL路由的。比如访问<code>http://127.0.0.1/news/</code>是访问新闻列表页,这些东西就需要在这个文件中完成。</li>
<li><code>wsgi.py</code>:项目与WSGI工协议兼容的web服务器入口,部署的时候需要用到的,一般情况下也是不需要修改的。</li>
</ol>
<h3>project和app的关系</h3>
<p><code>app</code>是<code>django</code>项目的组成部分。一个<code>app</code>代表项目中的一个模块,所有<code>URL</code>请求的响应都是由<code>app</code>来处理。比如豆瓣,里面有图书,电影,音乐,同城等许许多多的模块,如果站在<code>django</code>的角度来看,图书,电影这些模块就是<code>app</code>,图书,电影这些<code>app</code>共同组成豆瓣这个项目。因此这里要有一个概念,<code>django</code>项目由许多 <code>app</code>组成,一个<code>app</code>可以被用到其他项目,<code>django</code>也能拥有不同的<code>app</code>。</p>
<p>通过命令:</p>
<pre><code class=“language-Markdown”>python manage.py startapp book</code></pre>
<h2>URL分发器</h2>
<h3>一、视图:</h3>
<p>视图一般都写在 <code>app</code> 的 <code>views.py</code> 中。并且视图的第一个参数永远都是 <code>request</code> (一个<code>HttpRequest</code>)对象。这个对象存储了请求过来的所有信息,包括携带的参数以及一些头部信息等。在视图中,一般是完成逻辑相关的操作。</p>
<pre><code class=“language-Python”>def book_list(request):
return HttpResponse("书籍列表!")</code></pre>
<p>视图可以是函数,也可以是类。</p>
<h3>二、URL映射:</h3>
<p>视图写完后,要与URL进行映射,即用户在浏览器中输入什么 <code>url</code> 的时候可以请求到这个视图函数。</p>
<p>在用户输入了某个 <code>url </code>,请求到我们的网站的时候, <code>django</code> 会从项目的 <code>urls.py</code> 文件中寻找对应的视图。</p>
<p>在 <code>urls.py</code> 文件中有一个 <code>urlpatterns</code> 变量,以后 <code>django</code> 就会从这个变量中读取所有的匹配规则。</p>
<p>匹配规则需要使用 <code>django.urls.path</code> 函数进行包裹,这个函数会根据传入的参数返回<code>URLPattern</code> 或者是 <code>URLResolver</code> 的对象。示例代码如下:</p>
<pre><code class=“language-Python”>from django.contrib import admin
from django.urls import path
from book import views
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',views.book_list)
]</code></pre>
<h4>URL中添加参数:</h4>
<p>有时候, url 中包含了一些参数需要动态调整。</p>
<p>比如博客某篇文章的详情页的url,是<code>https://moshanghua.net/details/3276</code> 后面的 <code>3276</code> 就是这篇文章的 <code>id</code> ,那么文章详情页面的<code>url</code>就可以写成 <code>https://moshanghua.net/details/<id> </code>,其中id就是文章的id。</p>
<p>在django 中实现这种需求。可以在 <code>path</code> 函数中,使用尖括号的形式来定义一个参数。比如我现在想要获取一本书籍的详细信息,那么应该在 url 中指定这个参数。示例代码如下:</p>
<pre><code class=“language-Markdown”>from django.contrib import admin
from django.urls import path
from book import views
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',views.book_list),
path('book/<book_id>',views.book_detail)
]</code></pre>
<p>而 <code>views.py</code> 中的代码如下:</p>
<pre><code class=“language-Python”>def book_detail(request, book_id):
return HttpResponse(f"您查询的图书 id 是: {book_id}")</code></pre>
<p>在指定参数时,也可以指定参数的类型,比如以上 <code>book_id</code> 为整形,那么在定义 <code>URL</code> 的时候,就可以使用以下语法实现:</p>
<pre><code class=“language-Python”>…
path('book/<int:book_id>',views.book_detail)
…</code></pre>
<p>除了 <code>int</code> 类型, django 的 <code>path</code> 部分还支持 <code>str</code> 、 <code>slug</code> 、 <code>uuid</code> 、 <code>path</code> 类型。</p>
<p>也可以通过<strong>查询字符串</strong>的方式传递一个参数过去。示例代码如下:</p>
<pre><code class=“language-Python”>urlpatterns = [
path('admin/', admin.site.urls),
path('book/',views.book_list),
path('book/detail',views.book_detail)
]</code></pre>
<p>在 <code>views.py</code> 中的代码如下:</p>
<pre><code class=“language-Python”>def book_detail(request):
book_id = request.GET.get("id")
name = request.GET.get("name")
return HttpResponse(f"您查询的图书 id 是: {book_id},图书的名称是:《{name}》")</code></pre>
<p>在访问的时候就是通过 <code>/book/detail?id=1&name=xx</code> 即可将参数传递过去。</p>
<h4>path函数详解</h4>
<p><code>path</code> 函数的定义为: <code>path(route,view,name=None,kwargs=None)</code> 。</p>
<p><code>route</code> 参数: <code>url</code> 的匹配规则。</p>
<p>这个参数中可以指定 <code>url</code> 中需要传递的参数,比如在访问文章详情页的时候,可以传递一个<code> id </code>。传递参数是通过 <code><></code> 尖括号来进行指定的。并且在传递参数的时候,可以指定这个参数的数据类型,比如文章的 <code>id</code> 都是 <code>int</code> 类型,那么可以这样写 <code><int:id></code> ,以后匹配的时候,就只会匹配到 <code>id</code> 为 <code>int</code> 类型的 <code>url</code>,而不会匹配其他的 <code>url</code> ,并且在视图函数中获取这个参数的时候,就已经被转换成一个 1.<code>int</code> 类型了。其中还有几种常用的类型:</p>
<p>2.<code>str</code> :非空的字符串类型。默认的转换器。但是不能包含斜杠。</p>
<p>3.<code>int</code> :匹配任意的零或者正数的整形。到视图函数中就是一个<code>int</code>类型。</p>
<p>4.<code>slug</code> :由英文中的横杠 <code>-</code> 或者下划线 <code>_</code> 连接英文字符或者数字而成的字符串。</p>
<p>5.<code>uuid</code> :匹配 <code>uuid</code> 字符串。</p>
<p>6.<code>path</code> :匹配非空的英文字符串,可以包含斜杠 <code>/</code></p>
<p><code>view</code> 参数:可以为一个视图函数或者是 <code>类视图.as_view()</code> 或者是 <code>django.urls.include()</code> 函数的返回值。</p>
<p><code>name</code> 参数:这个参数是给这个 <code>url </code>取个名字的,在项目比较大, url 比较多的时候用处很大。</p>
<h4>URL中包含另外一个urls模块(路由模块化):</h4>
<p>在项目中,不可能只有一个 <code>app</code> ,如果把所有的 <code>app</code> 的 <code>views</code> 中的视图都放在 <code>urls.py</code> 中进行映射,肯定会让代码显得非常乱。</p>
<p>因此 django 给提供了一个方法,可以在 <code>app</code> 内部包含自己的 <code>url</code> 匹配规则,而在项目的 <code>urls.py</code> 中再统一包含这个 <code>app</code> 的 <code>urls </code>。使用这个技术需要借助 include 函数。示例代码如下:</p>
<pre><code class=“language-Python”># startdjango/urls.py文件:
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',include("book.urls"))
]</code></pre>
<p>在 <code>urls.py</code> 文件中把所有的和 <code>book</code> 这个 <code>app</code> 相关的 <code>url</code> 都移动到 <code>app/urls.py</code> 中了,然后在<code>startdjango/urls.py</code> 中,通过 <code>include</code> 函数包含 <code>book.urls</code> ,以后在请求<code> book</code> 相关的<code>url</code>的时候都需要加一个 <code>book</code> 的前缀。</p>
<pre><code class=“language-Python”># book/urls.py文件:
from django.urls import path
from . import views
urlpatterns = [
path('list/',views.book_list),
path('detail/<book_id>/',views.book_detail)
]</code></pre>
<p>访问书的列表的 <code>url</code> 的时候,就通过 <code>/book/list/</code> 来访问,访问书籍详情页面的 url 的时候就通过<code>book/detail/<id></code> 来访问。为了避免多个模块的 <code>urls.py</code> 中包含同名的<code> url</code> ,可以指定一个应用命名空间:</p>
<pre><code class=“language-Python”># book/urls.py文件:
from django.urls import path
from . import views
指定应用命名空间
app_name='book'
urlpatterns = [
path('list/',views.book_list),
path('detail/<book_id>/',views.book_detail)
]</code></pre>
<h4>url反转(路由反转)</h4>
<p>一般是通过<code>url</code>来访问视图函数。有时候知道这个视图函数,但是想反转回它的<code>url</code>。</p>
<p>这时候就可以通过 <code>reverse</code> 来实现。示例代码如下:</p>
<pre><code class=“language-Python”>print(reverse("list"))
/book/list/</code></pre>
<p>如果有应用命名空间或者有实例命名空间,那么应该在反转的时候加上命名空间。示例代码如下:</p>
<pre><code class=“language-text”>print(reverse('book:list'))
/book/list/</code></pre>
<p>如果这个<code>url</code>中需要传递参数,那么可以通过 <code>kwargs</code> 来传递参数。示例代码如下:</p>
<pre><code class=“language-Python”>print(reverse("book:detail",kwargs={"book_id":1}))
/book/detail/1</code></pre>
<p>因为 django 中的 <code>reverse</code> 反转 <code>url</code> 的时候不区分 <code>GET</code> 请求和 <code>POST</code> 请求,因此不能在反转的时候添加查询字符串的参数。如果想要添加查询字符串的参数,只能手动的添加。示例代码如下:</p>
<pre><code class=“language-Python”>login_url = reverse('login') + "?next=/"
print(login_url)</code></pre>

评论区
django封装的东西太多了,学了一点最后入门flask
macOSEdge