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