Python学习之路系列文章目录
第1个Django应用及Django的请求处理
- Python学习之路系列文章目录
- 一、PyCharm创建django项目
- 二、创建app
- 三、django如何处理请求?<br><br>
- 四、基本的路由配置
-
- [1. 这是最简单的一级路由:](#1. 这是最简单的一级路由:)
- [2. 这是二级路由:](#2. 这是二级路由:)
- [3. 使用参数的路由](#3. 使用参数的路由)
- 五、path转化器
- 六、path方法
- 总结
一、PyCharm创建django项目
- 打开软件并选择新建项目
注意:更多设置里面那个模板文件夹清空,标准的项目不包含那个文件夹
点击创建就成功了
manage文件主要是用于项目管理,启动项目,创建app,数据管理(不要乱动这个文件)
settings.py 是项目配置文件
urls.py 是配置路由的地方
wsgi.py 同步接受网络请求(不要乱动这个文件)
asgi.py 异步接受网络请求(不要乱动这个文件)
二、创建app
什么是app
在 Django 项目中,一个 "app"(应用)是指一个具有特定功能的独立模块。每个 Django 项目都由一个或多个应用组成,每个应用都负责处理特定的功能或业务逻辑。
一个 Django 应用通常包含以下内容:
- 模型(Models):定义数据结构和数据库表格的方式。
- 视图(Views):处理用户请求,与模型交互并返回响应。
- 模板(Templates):定义呈现给用户的页面内容。
- URL 配置(URLs):指定处理不同 URL 请求的视图函数。
- 静态文件(Static files):如图片、CSS 文件、JavaScript 文件等。
- 管理命令(Management commands):自定义的 Django 命令,可用于执行各种任务。
通过将功能划分为多个应用,可以使 Django 项目更加模块化、易于维护和扩展。每个应用都可以独立开发、测试和部署,同时还可以在不同的项目中重复使用。
怎么创建app
- 点击create app (也可以直接点下面的终端输入
startapp <app名称>
)
如图所示:
- 然后去setting.py文件下看是否注册好了,如果没加上就手动添上。
- 接下来在
urls.py
中配置路由规则(也就是确定请求的URL应该由哪个视图函数来处理)
-
配置好路由后就得去写对应的 view 视图(页面)了
打开之前创建的app 找到
views.py
文件这个
index
就是之前配置路由指定运行的函数
- 最后点击运行即可在浏览器看效果了
补充:
命令行启动:
bash
PS E:\02code\PycharmProjects\djangoTest> python manage.py runserver
三、django如何处理请求?
Django的请求处理流程通常如下:
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 在列表中的位置非常关键。视图函数或类:一旦Django确定了应该处理请求的视图函数或类,它会调用该视图来处理请求。视图函数或类接收请求对象作为参数,并返回一个HTTP响应对象。
- 函数视图:如果使用函数视图,那么这个视图就是一个简单的Python函数,它接收请求对象作为参数,并返回一个HTTP响应对象。
- 类视图:如果使用类视图,那么这个视图就是一个继承自Django提供的视图类的Python类,通常至少包含一个dispatch()方法来处理不同类型的请求(GET、POST等),并且每个HTTP请求方法通常都有对应的方法(例如get()、post())来处理相应的请求类型。
处理请求:在视图函数或类中,你可以编写逻辑来处理请求。这可能包括从数据库中检索数据、处理表单数据、渲染模板等操作。
返回响应:最后,视图函数或类应该返回一个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 中的某个部分的格式或类型,并将其传递给相应的视图函数。
以下是一些常用的路径转换器及其作用:
-
<int:name>
: 将URL中的部分作为整数参数传递给视图函数。pythonpath('post/<int:post_id>/', views.post_detail, name='post_detail')
这个路径转换器用于捕获整数类型的值,例如
post/123/
,其中的123
将作为整数参数post_id
传递给视图函数。 -
<str:name>
: 将URL中的部分作为字符串参数传递给视图函数。pythonpath('category/<str:category_name>/', views.category_detail, name='category_detail')
这个路径转换器用于捕获字符串类型的值,例如
category/technology/
,其中的technology
将作为字符串参数category_name
传递给视图函数。 -
<slug:name>
: 将URL中的部分作为slug参数(通常是一个短标签,包含小写字母、数字、下划线和连字符)传递给视图函数。pythonpath('article/<slug:article_slug>/', views.article_detail, name='article_detail')
这个路径转换器用于捕获slug类型的值,例如
article/my-first-post/
,其中的my-first-post
将作为 slug 参数article_slug
传递给视图函数。 -
<uuid:name>
: 将URL中的部分作为UUID参数(通常是全局唯一标识符)传递给视图函数。pythonpath('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
传递给视图函数。 -
<path:name>
: 将URL中的部分作为路径参数传递给视图函数。这个转换器用于捕获包含斜杠(/)的路径,允许你捕获包括斜杠在内的任何字符。pythonpath('file/<path:file_path>/', views.file_detail, name='file_detail')
这个路径转换器用于捕获路径类型的值,例如
file/documents/report.pdf
,其中的documents/report.pdf
将作为路径参数file_path传递给视图函数。 -
<date:name>
: 将URL中的部分作为日期参数传递给视图函数。这个转换器用于捕获日期类型的值,可以指定日期的格式。pythonpath('event/<date:event_date>/', views.event_detail, name='event_detail')
这个路径转换器用于捕获日期类型的值,例如
event/2024-04-05/
,其中的2024-04-05
将作为日期参数event_date
传递给视图函数。 -
<path to converter:parameter>
: 这个转换器允许你自定义路径转换器。你可以创建自己的转换器,并在URL模式中使用它们。pythonpath('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
方法中的第一个参数时,有一些注意事项需要考虑:- 斜杠结尾:
如果
route
以斜杠结尾(例如'articles/'
),则请求该 URL 时,末尾有无斜杠都会被匹配。例如,/articles/
和/articles
都会匹配到'articles/'
这个路由。因此,在设计route
时需要根据实际情况确定是否以斜杠结尾。
2. 常量部分和路径转换器的顺序 :在
route
中定义常量部分和路径转换器时,它们的顺序很重要。Django 会按照route
中的顺序进行匹配,因此应该根据需要将常量部分和路径转换器按照正确的顺序放置,以确保正确的匹配。-
路径转换器的选择 :
使用正确的路径转换器非常重要。选择与实际需要相符合的转换器可以帮助 Django 捕获和处理 URL 中的动态部分。例如,如果需要匹配一个整数参数,应该使用
int
转换器;如果需要匹配一个包含任意字符的路径段,应该使用path
转换器。 -
命名路由的唯一性 :
如果为
route
分配了一个名称,确保该名称在整个 Django 项目中是唯一的。这样可以避免在进行 URL 反向解析时出现混淆或错误。 -
路由冲突 :
当定义多个 URL 模式时,要注意避免路由冲突。如果有两个或多个 URL 模式具有相似的
route
,可能会导致不确定的匹配行为或错误的路由解析。 -
使用命名路由进行 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 路由,并将请求映射到相应的视图函数或视图类进行处理。
总结
这个人很懒,不愿意写总结。