Django 基础

2024/7/27 17:08:47Chixm55 阅读0 点赞1 评论

Django5 入门

Django相关的网址

Github源代码:https://github.com/django/django

Django官网:https://www.djangoproject.com/

安装Django

通过pip install django安装django,本文以Django 5.0.3 版本进行记录。

PYTHON
pip install django
#如需要指定版本用这个命令
pip install django==5.0.3

初始化 Django 项目

创建项目使用命令:django-admin startproject [项目名称] 即可创建。

初始化一个新的 Django 项目,例如:

TEXT
django-admin startproject startdjango

创建应用(app):一个项目类似于是一个架子,但是真正起作用的还是app

在终端进入到项目所在的路径,然后执行python manage.py startapp [app名称] 创建一个app。

运行Django项目

进入项目,通过命令行的方式:python manage.py runserver

这样可以在本地访问项目网站,默认端口号是8000,在浏览器中通过http://127.0.0.1:8000/ 来访问

BASH
cd startdjango
python manage.py runserver

如果想要修改端口号,那么在运行的时候可以指定端口号,python manage.py runserver 9000这样就可以通过9000端口来访问

PYTHON
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

通过命令:

MARKDOWN
python manage.py startapp book

URL分发器

一、视图:

视图一般都写在appviews.py中。并且视图的第一个参数永远都是request(一个HttpRequest)对象。这个对象存储了请求过来的所有信息,包括携带的参数以及一些头部信息等。在视图中,一般是完成逻辑相关的操作。

PYTHON
def book_list(request):     
    return HttpResponse("书籍列表!")

视图可以是函数,也可以是类。

二、URL映射:

视图写完后,要与URL进行映射,即用户在浏览器中输入什么url 的时候可以请求到这个视图函数。

在用户输入了某个url ,请求到我们的网站的时候,django会从项目的urls.py 文件中寻找对应的视图。

urls.py文件中有一个urlpatterns变量,以后django 就会从这个变量中读取所有的匹配规则。

匹配规则需要使用django.urls.path函数进行包裹,这个函数会根据传入的参数返回URLPattern或者是URLResolver 的对象。示例代码如下:

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) 
]

URL中添加参数:

有时候, url 中包含了一些参数需要动态调整。

比如博客某篇文章的详情页的url,是https://moshanghua.net/details/3276后面的3276就是这篇文章的id,那么文章详情页面的url就可以写成https://moshanghua.net/details/<id> ,其中id就是文章的id。

在django 中实现这种需求。可以在path 函数中,使用尖括号的形式来定义一个参数。比如我现在想要获取一本书籍的详细信息,那么应该在 url 中指定这个参数。示例代码如下:

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) 
]

views.py 中的代码如下:

PYTHON
def book_detail(request, book_id):
    return HttpResponse(f"您查询的图书 id 是: {book_id}")

在指定参数时,也可以指定参数的类型,比如以上book_id为整形,那么在定义URL 的时候,就可以使用以下语法实现:

PYTHON
...
path('book/<int:book_id>',views.book_detail) 
...

除了int类型, django 的path部分还支持strsluguuidpath 类型。

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

PYTHON
urlpatterns = [
    path('admin/', admin.site.urls),     
    path('book/',views.book_list),     
    path('book/detail',views.book_detail) 
]

views.py 中的代码如下:

PYTHON
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 函数。示例代码如下:

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")) 
]

urls.py文件中把所有的和book这个app相关的url都移动到app/urls.py中了,然后在startdjango/urls.py中,通过include函数包含book.urls,以后在请求 book相关的url的时候都需要加一个book 的前缀。

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) 
]

访问书的列表的url的时候,就通过/book/list/来访问,访问书籍详情页面的 url 的时候就通过book/detail/<id>来访问。为了避免多个模块的urls.py中包含同名的 url ,可以指定一个应用命名空间:

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) 
]

url反转(路由反转)

一般是通过url来访问视图函数。有时候知道这个视图函数,但是想反转回它的url

这时候就可以通过reverse 来实现。示例代码如下:

PYTHON
print(reverse("list")) 
> /book/list/

如果有应用命名空间或者有实例命名空间,那么应该在反转的时候加上命名空间。示例代码如下:

TEXT
print(reverse('book:list')) 
> /book/list/

如果这个url中需要传递参数,那么可以通过kwargs 来传递参数。示例代码如下:

PYTHON
print(reverse("book:detail",kwargs={"book_id":1}))
> /book/detail/1

因为 django 中的reverse反转url的时候不区分GET请求和POST 请求,因此不能在反转的时候添加查询字符串的参数。如果想要添加查询字符串的参数,只能手动的添加。示例代码如下:

PYTHON
login_url = reverse('login') + "?next=/"
print(login_url)

评论区

  • 部落志#1
    部落志2024/12/27 23:16:22

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

    河北省macOSEdge