第1个Django应用及Django的请求处理

Python学习之路系列文章目录

  1. python面向对象之警察与匪徒火拼场景模拟
  2. python面向对像之第二次笔记
  3. Django环境搭建及测试
  4. 第1个Django应用及Django的请求处理

第1个Django应用及Django的请求处理

一、PyCharm创建django项目

  1. 打开软件并选择新建项目

注意:更多设置里面那个模板文件夹清空,标准的项目不包含那个文件夹

点击创建就成功了

manage文件主要是用于项目管理,启动项目,创建app,数据管理(不要乱动这个文件)

settings.py 是项目配置文件

urls.py 是配置路由的地方

wsgi.py 同步接受网络请求(不要乱动这个文件)

asgi.py 异步接受网络请求(不要乱动这个文件)

二、创建app

什么是app

在 Django 项目中,一个 "app"(应用)是指一个具有特定功能的独立模块。每个 Django 项目都由一个或多个应用组成,每个应用都负责处理特定的功能或业务逻辑。

一个 Django 应用通常包含以下内容:

  1. 模型(Models):定义数据结构和数据库表格的方式。
  2. 视图(Views):处理用户请求,与模型交互并返回响应。
  3. 模板(Templates):定义呈现给用户的页面内容。
  4. URL 配置(URLs):指定处理不同 URL 请求的视图函数。
  5. 静态文件(Static files):如图片、CSS 文件、JavaScript 文件等。
  6. 管理命令(Management commands):自定义的 Django 命令,可用于执行各种任务。

通过将功能划分为多个应用,可以使 Django 项目更加模块化、易于维护和扩展。每个应用都可以独立开发、测试和部署,同时还可以在不同的项目中重复使用。

怎么创建app

  1. 点击create app (也可以直接点下面的终端输入 startapp <app名称>

如图所示:

  1. 然后去setting.py文件下看是否注册好了,如果没加上就手动添上。
  1. 接下来在 urls.py 中配置路由规则(也就是确定请求的URL应该由哪个视图函数来处理)
  1. 配置好路由后就得去写对应的 view 视图(页面)了

    打开之前创建的app 找到 views.py 文件

    这个 index 就是之前配置路由指定运行的函数

  1. 最后点击运行即可在浏览器看效果了

补充:

命令行启动:

bash 复制代码
PS E:\02code\PycharmProjects\djangoTest> python manage.py runserver

三、django如何处理请求?

Django的请求处理流程通常如下:

  1. URL 配置:首先,Django会根据项目中的URL配置确定哪个视图函数或类应该处理请求。URL配置通常在项目的 urls.py 文件中定义。
    决定好要使用的根 URLconf 模块。通常,这是 ROOT_URLCONF 设置的值,但是如果传入的 HttpRequest 对象具有 urlconf 属性(由中间件设置) ,则其值将被用于代替 ROOT_URLCONF 设置。也就是说你可以自定义项目入口url是哪个文件!
    接着加载该模块并寻找可用的 urlpatterns ,它是 django.urls.path() 或者 django.urls.re_path() 实例的一个列表,依次匹配每个URL模式,在与请求的URL相匹配的第一个模式停下来。也就是说, url 匹配是从上往下的短路操作,所以 url 在列表中的位置非常关键。

  2. 视图函数或类:一旦Django确定了应该处理请求的视图函数或类,它会调用该视图来处理请求。视图函数或类接收请求对象作为参数,并返回一个HTTP响应对象。

    • 函数视图:如果使用函数视图,那么这个视图就是一个简单的Python函数,它接收请求对象作为参数,并返回一个HTTP响应对象。
    • 类视图:如果使用类视图,那么这个视图就是一个继承自Django提供的视图类的Python类,通常至少包含一个dispatch()方法来处理不同类型的请求(GET、POST等),并且每个HTTP请求方法通常都有对应的方法(例如get()、post())来处理相应的请求类型。
  3. 处理请求:在视图函数或类中,你可以编写逻辑来处理请求。这可能包括从数据库中检索数据、处理表单数据、渲染模板等操作。

  4. 返回响应:最后,视图函数或类应该返回一个HTTP响应对象。这个响应对象可以是HTML内容、JSON数据、重定向等,具体取决于应用程序的需求和视图的目的。

    如果匹配的表达式返回了未命名的组,那么匹配的内容将作为位置参数提供给视图。
    关键字参数由表达式匹配的命名组组成,但是可以被 django.urls.pathO 的可选参数 kwargs 覆盖。
    如果没有匹配到任何表达式,或者过程中抛出异常,将调用一个适当的错误处理视图。(比如403,比如无任何反应)

举个例子:

假设我们有一个简单的博客应用,用户可以访问博客首页查看所有的文章列表。当用户访问网站的首页时,Django将处理该请求并返回包含所有文章的页面。

首先,我们需要定义一个URL配置,告诉Django当用户访问首页时应该调用哪个视图来处理请求。

python 复制代码
# 项目的urls.py文件

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

然后,我们需要编写一个视图函数来处理首页的请求。我们可以在应用程序的views.py文件中定义这个视图函数。

python 复制代码
# 应用程序的views.py文件

from django.shortcuts import render
from .models import Post

def index(request):
    # 从数据库中获取所有文章
    posts = Post.objects.all()
    # 渲染模板并将文章传递给模板
    return render(request, 'blog/index.html', {'posts': posts})

在这个例子中,index视图函数接收一个 request 参数,代表用户发出的请求。该函数从数据库中获取所有文章,并将它们传递给名为 index.html 的模板进行渲染。最后,它返回一个HTTP响应对象,其中包含渲染后的页面内容。

最后,我们需要创建一个模板来显示所有的文章。我们可以在应用程序的templates/blog目录下创建一个名为index.html的模板文件。

html 复制代码
<!-- 应用程序的templates/blog/index.html文件 -->

<!DOCTYPE html>
<html>
<head>
    <title>博客首页</title>
</head>
<body>
    <h1>欢迎来到我的博客</h1>
    <ul>
        {% for post in posts %}
            <li>{{ post.title }}</li>
        {% endfor %}
    </ul>
</body>
</html>

现在,当用户访问网站的首页时,Django将按照上述流程处理请求,从数据库中获取所有文章,并将它们渲染到名为index.html的模板中,最终返回给用户一个包含所有文章列表的页面。

四、基本的路由配置

假设我们有一个名为myapp的应用程序,并且我们想要定义一些简单的路由来处理用户的请求。

首先,我们需要在项目的主URL配置文件中(通常是urls.py)定义主路由。然后,我们可以在应用程序的URL配置文件中定义应用程序特定的子路由。

1. 这是最简单的一级路由:

urlpatterns 是个列表,每个元素都是 path() 或 re_path() 的实例

python 复制代码
from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index)
]

2. 这是二级路由:

myapp应用程序的URL配置包含到主URL配置中,并指定了一个前缀myapp/,这意味着当用户访问以/myapp/开头的URL时,Django将会交给myapp应用程序处理。

python 复制代码
# 项目的urls.py文件

from django.contrib import admin
from django.urls import path, include  # 导入include函数用于包含应用程序的URL配置

urlpatterns = [
    path('admin/', admin.site.urls),
    path('myapp/', include('myapp.urls')),  # 包含myapp应用程序的URL配置
]

也就是说访问这个路由时,不会直接调用指定的函数,而是使用include()把第二级路由交给myapp的urls去配置。

python 复制代码
# myapp应用程序的urls.py文件

from django.urls import path
from . import views  # 导入应用程序的视图模块

urlpatterns = [
    path('', views.index, name='index'),  # 定义一个空路由,指向index视图函数
    path('about/', views.about, name='about'),  # 定义一个路由,指向about视图函数
]

3. 使用参数的路由

参数部分使用尖括号,可以指定参数类型,很像键值对的形式(类型:参数)

python 复制代码
from django.urls import path
from . import views

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/', views.month_archive),
    path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]

匹配的时候从上到下依次匹配,成功了则终止继续匹配。

例如:

  • /articles/2005/03/ 将匹配第三条,并调用 views.month_archive(request, year=2005,month=3)
  • /articles/2003/ 匹配第一条,并调用 views.special_case_2003(request)
  • /articles/2003 一条都匹配不上,因为它最后少了一个斜杠,而列表中的所有模式中都以斜杠结尾;
  • /articles/2003/03/building-a-django-site/ 将匹配最后一个,并调用views.article_detail(request, year=2003, month=3, slug="building-a-django-site"

五、path转化器

Django 中,路径转换器(path converter)是一种机制,用于将URL中的特定部分提取为视图函数的参数。路径转换器允许你指定 URL 中的某个部分的格式或类型,并将其传递给相应的视图函数。

以下是一些常用的路径转换器及其作用:

  1. <int:name> : 将URL中的部分作为整数参数传递给视图函数。

    python 复制代码
    path('post/<int:post_id>/', views.post_detail, name='post_detail')

    这个路径转换器用于捕获整数类型的值,例如 post/123/ ,其中的 123 将作为整数参数 post_id 传递给视图函数。

  2. <str:name> : 将URL中的部分作为字符串参数传递给视图函数。

    python 复制代码
    path('category/<str:category_name>/', views.category_detail, name='category_detail')

    这个路径转换器用于捕获字符串类型的值,例如 category/technology/ ,其中的 technology 将作为字符串参数 category_name 传递给视图函数。

  3. <slug:name> : 将URL中的部分作为slug参数(通常是一个短标签,包含小写字母、数字、下划线和连字符)传递给视图函数。

    python 复制代码
    path('article/<slug:article_slug>/', views.article_detail, name='article_detail')

    这个路径转换器用于捕获slug类型的值,例如 article/my-first-post/ ,其中的 my-first-post 将作为 slug 参数 article_slug 传递给视图函数。

  4. <uuid:name> : 将URL中的部分作为UUID参数(通常是全局唯一标识符)传递给视图函数。

    python 复制代码
    path('user/<uuid:user_id>/', views.user_profile, name='user_profile')

    这个路径转换器用于捕获UUID类型的值,例如 user/123e4567-e89b-12d3-a456-426614174000/ ,其中的 123e4567-e89b-12d3-a456-426614174000 将作为UUID参数 user_id 传递给视图函数。

  5. <path:name> : 将URL中的部分作为路径参数传递给视图函数。这个转换器用于捕获包含斜杠(/)的路径,允许你捕获包括斜杠在内的任何字符。

    python 复制代码
    path('file/<path:file_path>/', views.file_detail, name='file_detail')

    这个路径转换器用于捕获路径类型的值,例如 file/documents/report.pdf ,其中的 documents/report.pdf 将作为路径参数file_path传递给视图函数。

  6. <date:name>: 将URL中的部分作为日期参数传递给视图函数。这个转换器用于捕获日期类型的值,可以指定日期的格式。

    python 复制代码
    path('event/<date:event_date>/', views.event_detail, name='event_detail')

    这个路径转换器用于捕获日期类型的值,例如event/2024-04-05/,其中的2024-04-05将作为日期参数event_date传递给视图函数。

  7. <path to converter:parameter>: 这个转换器允许你自定义路径转换器。你可以创建自己的转换器,并在URL模式中使用它们。

    python 复制代码
    path('custom/<custom_converter:custom_param>/', views.custom_view, name='custom_view')

    这个路径转换器用于捕获自定义转换器类型的值,例如custom/value/,其中的value将作为自定义参数custom_param传递给视图函数。

六、path方法

path 方法是 Django 中定义 URL 路由的一种常用方式。它通常用于在 Django 项目中的 urls.py 文件中定义 URL 模式。path 方法的基本语法如下:

python 复制代码
path(route, view, kwargs=None, name=None)

其中:

  • route 是一个字符串,表示 URL 的模式匹配规则,可以包含路径转换器和常量部分,并且可以通过命名来标识和引用。

    当使用 route 作为 path 方法中的第一个参数时,有一些注意事项需要考虑:

    1. 斜杠结尾

    如果 route 以斜杠结尾(例如 'articles/'),则请求该 URL 时,末尾有无斜杠都会被匹配。例如,/articles//articles 都会匹配到 'articles/' 这个路由。因此,在设计 route 时需要根据实际情况确定是否以斜杠结尾。
    2. 常量部分和路径转换器的顺序

    route 中定义常量部分和路径转换器时,它们的顺序很重要。Django 会按照 route 中的顺序进行匹配,因此应该根据需要将常量部分和路径转换器按照正确的顺序放置,以确保正确的匹配。

    1. 路径转换器的选择

      使用正确的路径转换器非常重要。选择与实际需要相符合的转换器可以帮助 Django 捕获和处理 URL 中的动态部分。例如,如果需要匹配一个整数参数,应该使用 int 转换器;如果需要匹配一个包含任意字符的路径段,应该使用 path 转换器。

    2. 命名路由的唯一性

      如果为 route 分配了一个名称,确保该名称在整个 Django 项目中是唯一的。这样可以避免在进行 URL 反向解析时出现混淆或错误。

    3. 路由冲突

      当定义多个 URL 模式时,要注意避免路由冲突。如果有两个或多个 URL 模式具有相似的 route,可能会导致不确定的匹配行为或错误的路由解析。

    4. 使用命名路由进行 URL 反向解析

      如果需要在视图函数、模板或其他地方生成特定路由的 URL,最好使用命名路由进行 URL 反向解析,而不是硬编码 URL。这样可以提高代码的可维护性,并降低修改 URL 结构时的风险。

  • view 是一个视图函数或者视图类的引用,用于处理匹配到的 URL 请求。

  • kwargs 是一个字典,包含额外的关键字参数,传递给视图函数。

  • name 是一个可选的命名参数,用于为 URL 模式命名,使得在 Django 项目中的其他地方可以引用这个 URL 模式。

例如,下面是一个简单的 path 方法的示例:

python 复制代码
from django.urls import path
from . import views

urlpatterns = [
    path('hello/', views.say_hello, name='hello'),
]

在这个示例中,path 方法定义了一个 URL 模式 hello/,当用户访问这个 URL 时,将会调用名为 say_hello 的视图函数来处理请求。这个 URL 模式也被命名为 'hello',以便在其他地方引用它。

通过使用 path 方法,你可以方便地定义 Django 项目中的 URL 路由,并将请求映射到相应的视图函数或视图类进行处理。

总结

这个人很懒,不愿意写总结。

相关推荐
萧鼎26 分钟前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸27 分钟前
【一些关于Python的信息和帮助】
开发语言·python
疯一样的码农27 分钟前
Python 继承、多态、封装、抽象
开发语言·python
Wx-bishekaifayuan1 小时前
django电商易购系统-计算机设计毕业源码61059
java·spring boot·spring·spring cloud·django·sqlite·guava
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源
Python大数据分析@1 小时前
python操作CSV和excel,如何来做?
开发语言·python·excel
黑叶白树1 小时前
简单的签到程序 python笔记
笔记·python
Shy9604181 小时前
Bert完形填空
python·深度学习·bert