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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2020-01-13 0113笔记