Django配置视图和路由

1. 定义视图

  • 视图就是一个Python函数,被定义在应用views.py中.
  • 视图的第一个参数是HttpRequest类型的对象reqeust,包含了所有请求信息.
  • 视图必须返回HttpResponse对象,包含返回给请求者的响应信息.
  • 需要导入HttpResponse模块 :from django.http import HttpResponse

from django.shortcuts import render
from django.http import HttpRequest ,HttpResponse
# Create your views here.
"""
视图:
1.就是一个python函数
2.函数第一个参数是请求对象,是一个HttpRequest的示例对象
3.必须返回一个响应,返回的是一个HttpResponse或其子类的实例对象
"""
def index(request):
    return HttpResponse("index")

2. 配置路由

2.1 配置项目root路由:在项目目录下 settings.py 中配置 ROOT_URLCONF 指定root路由

ROOT_URLCONF = 'bookmanager.urls'

说明:默认值为: 项目目录.urls , 可修改,默认不修改

2.2 在工程目录下 urls.py 文件中配置urlpatterns, 是一个列表

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('book.urls'))   # 匹配任何路径
]

说明:

  • 列表每一个元素为一个url对象
  • url对象初始化第一个参数为一个正则表达式, 第二个参数是
  • 请求路径匹配规则:
    • 请求路径组成:http://ip.port/resource_path?a=1  ,匹配的是resource_path部分
    • 匹配时根据列表顺序依次匹配,如果没有匹配的项,则报错404,一旦匹配到,则引导到配置的资源(上面配置的第一项)或子应用的urls.py中继续匹配(上面配置的第二项)

2.3 路由匹配总结:

1.请求过来时,首先根据项目目录下settings.py 中 ROOT_URLCONF 配置找到路由配置所在的文件

2. 在配置所在文件中根据 urlpatterns 的配置按顺序依次进行正则匹配,一旦匹配到,则路由到对应的项目资源或者子应用中的路由。如果是引导到子应用中继续匹配路由,在子应用中匹配失败,则会回到这个列表继续往下匹配,如 对于下面的配置,如果匹配 http://127.0.0.1:8000/pay/order,则会匹配到 url(r'^pay/', include('pay.urls'))

项目目录的urls

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('book.urls')),  # 匹配任何路径
    url(r'^pay/', include('pay.urls'))
]

book.urls:

from django.conf.urls import url
from book.views import index

urlpatterns = [
    url(r'^index/$', index),
]

pay.urls:

from django.conf.urls import url
from pay.views import order


urlpatterns = [
    url(r'^order$', order)
]

 3.  ALLOWED_HOSTS

在工程setting.py文件中存在一个列表ALLOWED_HOSTS,这个列表包存允许访问当前服务的IP地址,默认有一个127.0.0.1

ALLOWED_HOSTS = []

4. 路由命名与reverse反解析

1 路由命名

在定义路由的时候,可以为路由命名,方便查找特定视图的具体路径信息。

1) 在使用include函数定义路由时,可以使用namespace参数定义路由的命名空间,如

url(r'^',include('book.urls',namespace='book'))

命名空间表示,凡是book.urls中定义的路由,均属于namespace指明的book名下。

命名空间的作用:避免不同应用中的路由使用了相同的名字发生冲突,使用命名空间区别开。

2) 在定义普通路由时,可以使用name参数指明路由的名字,如

urlpatterns = [
    url(r'^$',index),
    # 匹配书籍列表信息的URL,调用对应的bookList视图
    url(r'^booklist/$',bookList,name='index'),
    url(r'^testproject/$',views.testproject,name='test'),
]

 

2 reverse反解析

使用reverse函数,可以根据路由名称,返回具体的路径,如:

from django.core.urlresolvers import reverse
#或者
from django.urls import reverse

def testproject(request):

    return HttpResponse("OK")

# 定义视图:提供书籍列表信息
def bookList(request):

    url = reverse('book:test')
    print(url)
    return HttpResponse('index')

 

  • 对于未指明namespace的,reverse(路由name)
  • 对于指明namespace的,reverse(命名空间namespace:路由name)

 

posted @ 2021-01-13 22:44  foreast  阅读(171)  评论(0编辑  收藏  举报