51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Django 基础

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

项目结构介绍

  1. manage.py:以后和项目交互基本上都是基于这个文件。一般都是在终端输入python manage.py [子命令]。可以输入python manage.py help看下能做什么事情。除非你知道你自己在做什么,一般情况下不应该编辑这个文件。
  2. settings.py:本项目的设置项,以后所有和项目相关的配置都是放在这个里面。
  3. urls.py:这个文件是用来配置URL路由的。比如访问http://127.0.0.1/news/是访问新闻列表页,这些东西就需要在这个文件中完成。
  4. wsgi.py:项目与WSGI工协议兼容的web服务器入口,部署的时候需要用到的,一般情况下也是不需要修改的。

project和app的关系

appdjango项目的组成部分。一个app代表项目中的一个模块,所有URL请求的响应都是由app来处理。比如豆瓣,里面有图书,电影,音乐,同城等许许多多的模块,如果站在django的角度来看,图书,电影这些模块就是app,图书,电影这些app共同组成豆瓣这个项目。因此这里要有一个概念,django项目由许多 app组成,一个app可以被用到其他项目,django也能拥有不同的app

通过命令:

python manage.py startapp book

URL分发器

一、视图:

视图一般都写在 appviews.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 部分还支持 strsluguuidpath 类型。

也可以通过查询字符串的方式传递一个参数过去。示例代码如下:

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> ,以后匹配的时候,就只会匹配到 idint 类型的 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 ,如果把所有的 appviews 中的视图都放在 urls.py 中进行映射,肯定会让代码显得非常乱。

因此 django 给提供了一个方法,可以在 app 内部包含自己的 url 匹配规则,而在项目的 urls.py 中再统一包含这个 appurls。使用这个技术需要借助 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)
赞(2)
未经允许不得转载:工具盒子 » Django 基础