Django URL视图
视图
视图一般都写在app的 views.py中。并且视图的第一个参数永远都是request(一个HttpRequest)对象。返回值必须django.http.response.HttpResponseBase的子类的对象
这个对象存储了请求过来的所有信息,包括携带的参数以及一些头部信息等。在视图中,一般是完成逻辑相关的操作。比如这个请求是添加一篇博客,那么可以通过request来接收到这些数据,然后存储到数据库中,最后再把执行的结果返回给浏览器。视图函数的返回结果必须是 HttpResponseBase 对象或者子类的对象。
-
views.py文件示例代码
from django.http import HttpResponse def book_list(request): return HttpResponse("书籍列表!")
-
urls.py文件做映射
from django.urls import path from book import views urlpatterns = [ path('book/',views.book_list) ]
视图参数
url中包含了一些参数需要动态调整。比如简书某篇文章的详情页的url,是https://www.jianshu.com/p/a5aab9c4978e后面的a5aab9c4978e就是这篇文章的id,那么简书的文章详情页面的url就可以写成 https://www.jianshu.com/p/
指定参数形式
-
views.py示例代码:
def book_detail(request,book_id): text = "您输入的书籍的id是:%s" % book_id return HttpResponse(text)
-
urls.py代码示例
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) ]
访问127.0.0.1/book/1/即可。
查询字符串形式
-
views.py示例代码
def book_detail(request): #注意!查询字符串形式不需要其他的参数 book_id = request.GET.get("id") #id表示参数名称 也可以写成book_id = request.GET['id'] text = "您输入的书籍id是:%s" % book_id return HttpResponse(text)
-
urls.py示例代码
urlpatterns = [ path('admin/', admin.site.urls), path('book/',views.book_list), path('book/detail/',views.book_detail) ]
访问127.0.0.1/book/detail/?id=1即可
URL中包含另外一个urls模块
在我们的项目中,不可能只有一个app,如果把所有的app的views中的视图都放在urls.py中进行映射,肯定会让代码显得非常乱。因此django给我们提供了一个方法,可以在app内部包含自己的url匹配规则,而在项目的urls.py中再统一包含这个app的 urls,使用这个技术需要借助include函数。
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',include("book.urls"))
]
简单的说就是把项目的urls.py通过include函数包含其他app的urls.py文件。
Path函数
path函数的定义为: path(route,view,name=None,kwargs=None)。
-
route参数
route参数:url的匹配规则。这个参数中可以指定url中需要传递的参数
-
views参数
视图的返回值
-
name参数
这个参数是给这个url取个名字的,这在项目比较大,url比较多的时候用处很大。
-
kwargs参数
有时候想给视图函数传递一些额外的参数,就可以通过kwargs参数进行传递。这个参数接收一个字典。传到视图函数中的时候,会作为一个关键字参数传过去。
例如: from django.urls import path from . import views urlpatterns = [ path('blog/<int:year>/', views.year_archive, {'foo': 'bar'}), ]
那么以后在访问 blog/2019/这个url的时候,会将foo=bar作为关键字参数传给 year_archive函数。
URL命名
-
为什么要给url命名?
因为url是经常变化的,如果在代码中写死可能会经常改代码,给url取个名字,以后使用url的时候就使用他的名字进行反转。
-
如何给一个url指定名称?
在path函数中,传递一个‘name’参数即可,示例代码如下
urlpatters = [ path('signin/',views.login,name ='login') ]
-
url反转
上述示例代码name = 'login' 给url命名了。在views.py文件中就不需要写死参数,需要根据名字进行反转。
from django.shortcuts import redirect,reverse ... ... return redirect(reverse('login'))
这个代码的意思就是,通过login这个名字对应的url反转,反转之后的urls传递给redirect
所以网页显示的就是/singin/
-
应用命名空间
有多个app之间,有可能产生同名的url。这时候为了避免反转url的时候产生混淆。可以使用应用命名空间来做区分。在app中的urls.py文件中可以指定命名空间。
应用命名空间的变量是app_name = 'front'(示例)
url进行反转的时候就可以这样写:'front:login',这样的话,django就会从front命名空间下的login。