URL与视图
-
视图
视图一般都写在app的views.py中。并且视图的第一个参数永远是request(一个HttpRequest对象)。这个对象中存储了请求过来的所有的信息,包含携带的参数以及一些头部信息等。在视图中,一般是完成逻辑相关的操作。
视图的返回结果必须是HttpResponseBase对象或者子类的对象。 -
映射
-
视图写完后,要与URL进行映射,也即用户在浏览器中输入什么url的时候可以请求到这个视图函数,在用户输入了一个URL,请求到我们的网站的时候,django会从项目的urls.py文件中寻找对应的视图。
-
在url.py文件中有一个urlpatterns变量,当请求时会在里面进行匹配,匹配规则要用django.urls.path函数
urlpatterns = [ path('admin/', admin.site.urls) ]
-
此外有些url中有一些动态调整的参数。这是可以用 == 尖括号 == 的形式来定义一个参数。
urlpatterns = [ path('admin/<id>', admin.site.urls)]
。这时在views.py中的视图函数的参数可以加上此参数。def detail(request, id): pass
-
也可以通过请求的方式来从浏览器传递参数给服务器。这个时候参数会存在 request中。
-
在我们的项目中,有很多的app, 可以在每个app中添加一个urls.py ,然后在项目的urls.py中再统一包含这个app的urls。
path('',include(''))
-
path函数
path(route,view,name=None,kwargs=None)
- route参数
url的匹配规则。这个参数中可以指定url中需要传递的参数,<类型:id>。
str 非空的字符串类型。默认 值。
int 匹配任意的零或者正数的整形。
uuid 匹配uuid字符串
path 匹配非空的英文字符串乐也可以包含斜杠。 - view参数
可以为一个视图函数或者是类视图.as_view() 或者是 django.urls.include() 函数的返回值。 - name参数
这个参数是给这个url取个名字 - kwargs参数
用来传递一些额外的参数,这个参数接收一个字典。传到视图函数中的时候,会作为一个关键字传过去。path('blog/',view.year_archive,{'foo':'bar'})
- route参数
-
re_path函数
与path函数是一样的,不同的是,第一个参数可以用正则表达式。
-
include函数
include(pattern,namespace=None)
直接把其他app的urls包含进来。path('book/',include('book.urls',namespace=''))
include(pattern_list)
可以包含一个列表或者一个元组,元素为一个个pathinclude((pattern,app_namespace),namespace=None)
指明某个app的urls的时候可以指定命名空间。
-
url反转
如果想要知道一个view对应的url的话,可以通过 reverse函数来实现。
reverse('book:list')
reverse('book:detail',kwargs={'book_id':1})
-
自定义URL转换器
# 1、定义一个类 class FourDigitYearConverter: # 2、定义一个正则表达式 这个属性是用来保存url转换器规则的正则表达式 regex = '[0-9]{4}' # 3、定义to_python方法 这个方法是将url中的值转换一下,然后传给视图函数的 def to_python(self, value): return int(value) # 4、定义to_url方法 这个方法是在做url反转的时候,将传进来的参数转换后拼接成一个正确的url。 def to_url(self, value): return '%04d' % value #5、注册到django中 from django.urls import register_converter register_converter(converters.FourdigitYearCpnverter,'yyyy') urlpatterns = [ path('articles/<yyyy:year>/', views.year_archive), ]
-