django的视图函数和url分发器

mac2022-07-05  19

视图

1.视图函数的第一个参数必须是request,这个参数是绝对不能少的。 2.视图函数的返回值必须是django.http.response.HttpResponseBase的子类的对象 视图一般都写在app的views.py中,示例代码如下:

from django.http import HttpResponse def book(request): return HttpResponse('图书首页')

URL映射

视图写完后,就要与URL进行映射,也就是用户自输入什么url的时候可以请求到这个视图函数。在用户输入某个url时,django蛔虫项目的urls.py文件中知道对应的视图。在url.py文件中有一个urlpatterns变量,以后django就会从这个变量中读取所有的匹配规则。匹配规则需要使用django.urls.path函数进行包裹,这个函数会根据传入的参数返回URLPattern或者是URLResolver的对象。示例代码如下:

from django.contrib import admin from django.urls import path from book import views # 调取book模块的views urlpatterns = [ path('admin/', admin.site.urls), path('book/',views.book) # 匹配视图函数 ]

URL传参数

1.采用在url中使用变量的方式:在path的第一个参数中,使用<参数名>的方式可以传递参数。然后在视图函数中也要写一个参数,视图函数中的参数必须和url中的参数名称保持一致,不然就找不到这个参数。另外,url中可以传递多个参数。 2.采用查询字符串的方式:在url.py中,不需要单独的匹配查询字符串的部分。只需要在视图函数中使用request.GET.get('参数名')的方式来获取,示例代码如下:

def author_detail(request): author_id = request.GET['id'] text = '作者的id是:%s' % author_id return HttpResponse(text)

因为查询字符串使用的是GET请求,所以我们通过request.GET来获取参数。并且因为GET是一个类似于字典的数据类型,所有获取值跟字典的方式是一样的。

为什么需要url命名

因为url是经常变化的。如果在代码中写死可能会经常改代码。给url取个名字,以后使用url的时候就使用他的名字进行翻转就可以了,就不需要写死url了。

如何给一个url指定名称

在path函数中,传递一个name参数就可以指定,示例代码如下:

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

应用命名空间

在多个app之间,有可能产生同名的url。这时候为了避免反转url的时候产生混淆,可以用应用命名空间,来作区分。定义应用命名空间非常简单,只要在app的urls.py中定义一个叫做app_name的变量,来指定这个应用的命名空间即可。示例代码如下:

app_name = 'front' # 应用命名空间 urlpatterns = [ path('', views.index, name = 'index'), path('login/', views.login, name ='login') ]

以后在做反转的时候可以使用应用命名空间:url名称的方式进行反转。示例代码如下:

def index(request): username = request.GET.get('username') if username: return HttpResponse('前台首页') else: return redirect(reverse('front:login'))
最新回复(0)