然后继续继续。分开写。慢慢来
其实我觉得这些都是很低级的那种,写了感觉有点赘余,不写的话,又怕真的有新手不会。就当我啰嗦吧。多写点。自己到时候有什么补充继续补上去。
url的使用
正常启动一个项目的时候,会出现之前的那种。是因为你没有配置url。当我们打开一个网页,在网页上随便点,都会跳向新的页面。因为在后台已经给他配置好了它要去某个地方。这就是url配置。脑补下 html a链接 差不多有这个意思
url默认是在主目录中,主路由配置文件,会包含最基本的地址映射,并且每个地址访问都必须要先经过该文件。通过 urls中定义好的地址找到对应的视图处理函数
#url.py
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
这个是创建项目的时候。
Django如何处理一个请求
当一个用户请求Django 站点的一个页面,下面是Django 系统决定执行哪个Python 代码遵循的算法:
1:Django 决定要使用的根URLconf 模块。通常,这个值就是ROOT_URLCONF 的设置,但是如果进来的HttpRequest 对象具有一个urlconf 属性
(通过中间件request processing 设置),则使用这个值来替换ROOT_URLCONF 设置。
2:Django 加载该Python 模块并寻找可用的urlpatterns。它是django.conf.urls.url() 实例的一个Python 列表。
3:Django 依次匹配每个URL 模式,在与请求的URL 匹配的第一个模式停下来。
4:一旦其中的一个正则表达式匹配上,Django 将导入并调用给出的视图,它是一个简单的Python 函数(或者一个基于类的视图)。视图将获得如下参数:
一个HttpRequest 实例。
如果匹配的正则表达式返回了没有命名的组,那么正则表达式匹配的内容将作为位置参数提供给视图。
关键字参数由正则表达式匹配的命名组组成,但是可以被django.conf.urls.url()的可选参数kwargs覆盖。
5:如果没有匹配到正则表达式,或者如果过程中抛出一个异常,Django 将调用一个适当的错误处理视图。
比如handler404,handler500,handler403。我们也可以自定义对应的错误视图覆盖提供的默认错误处理视图
现在随便写个意思下。
#url.py
from django.contrib import admin
from django.http import HttpResponse #+
from django.urls import path
def demo_view(request): #+
return HttpResponse('cd-demo') #+
urlpatterns = [
path('admin/', admin.site.urls),
path('demo',demo_view) #+
]
我在urlpattrens中新添加了一个path,是为了匹配用户的访问路径。添加了一个demo_view视图函数。告诉浏览器,当我们访问http://127.0.0.1:8000/demo 的时候 触发demo_view这个函数 然后给我们返回 cd_demo。正常来讲,我们会创建一个view.py,专门放处理url的视图函数
如若你瞎逼写了个访问路径,肯定会访问不到,给你报错。这是在开发模式下,会告诉你找不到,错误。例如下面,我随便写了一个url,就会这样。另外在上线的时候,修改setting中 DEBUE = Flase 。会给你返回404错误。
然后细说一下。
django1.X路由的url与2.X路由path语法
引用路径的区别:
- 1.X: 使用的是
django.conf.urls.url
,django.conf.urls.include
- 2.X: 使用的是
django.urls.path
,django.urls.include
,django.urls.re_path
引入正则的区别:
- 1.X:
下面的示例使用简单的正则表达式分组匹配(通过圆括号)来捕获URL中的值并以位置参数形式传递给视图
在更高级的用法中,可以使用分组命名匹配的正则表达式组来捕获URL中的值并以关键字参数形式传递给视图。
在Python的正则表达式中,分组命名正则表达式组的语法是(?P<name>pattern),其中name是组的名称,pattern是要匹配的模式
urlpatterns = [
url('index-(\d+)-(\d+).html',views.index),
url('index-(?P<article_type_id>\d+)-(?P<category_id>\d+).html',views.index)
]
#url请求地址为:http://127.0.0.1:8000/index-1-1.html
- 2.X:
基本规则: - 使用尖括号(<>)从url中捕获值。
- 捕获值中可以包含一个转化器类型(converter type),比如使用 <int:name> 捕获一个整数变量。若果没 有转化器,将匹配任何字符串,当然也包括了 / 字符。
- 无需添加前导斜杠。
urlpatterns = [
path('index-<int:article_type_id>-<int:category_id>.html',views.index),
]
#url请求地址为:http://127.0.0.1:8000/index-1-1.html
在Python正则表达式中,命名式分组语法为 (?P<name>pattern) ,其中name为名称, pattern为待匹配的模式。这个与1.X的用法差不多,就是将1.X的url,改为re_path,
例子:
urlpatterns = [
path('articles/2003/', views.special_case_2003),
re_path('articles/(?P<year>[0-9]{4})/', views.year_archive),
re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/', views.month_archive),
re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[^/]+)/', views.article_detail),
]