1. 路由分组
1.1 路由匹配规则
- urls.py与view.py中的路由匹配规则
- 不允许一对多
- 允许一对一、多对一
# 一对一、多对一
path('index/', get_time)
path('time/', get_time)
# 一对多 默认匹配第一个,不会重复访问后面的
path('index/', get_time)
path('index/', eat)
1.2 动态路由的使用
目的:把正则匹配的内容传至视图函数中
- 注意简单分组和有名分组
- urls.py中导入
re_path
,使用该模块进行路径的正则匹配。 - view.py中,要接收正则匹配时传入的参数
urls.py
from django.contrib import admin
from django.urls import path, re_path
from app02.views import articles_details
urlpatterns = [
path('admin/', admin.site.urls),
# 1.简单分组 位置传参
# re_path('articles/(\d{4})/(\d{1, 2})', articles_details)
# 2.有名分组 关键字传参
# re_path('articles/(P<year>\d{4})/(P<month>\d{1, 2})', articles_details)
]
view.py
from django.shortcuts import render, HttpResponse
# Create your views here.
# 接收urls.py中传的参数
def articles_details(request, year, month):
return HttpResponse('访问时间是:%s年%s日' % (year, month))
2. 路由分发
目的:将urls.py中的路径解耦到不同的app应用中
- 首先,在项目的
urls.py
中建立映射关系
path('app/', include('app.urls'))
- 在app应用中创建
urls.py
,把所需路由写入该模块
3. request请求
3.1 请求逻辑
- 浏览器向服务端发送请求
wsig.py
把该请求封装成http格式的request对象,经由urls.py
路由转发,把该对象传给view.py
的形参request,进行业务处理;- 返回响应后的数据,并交由
wsig.py
封装数据传输给浏览器。
3.2 请求对象
目的:request发送get和post请求时如何获取数据
- 相应的属性和方法
- POST请求如何获取数据
from django.shortcuts import render, HttpResponse
# Create your views here.
def index(request):
# 1. 获取请求方式 POST/GET
print(request.method)
# 2. 获取请求体内容 POST 两种方式
# urlencoded: username=zp&pwd=123 json:{"user":"zp","pwd":123}
print(request.body)
# 只有数据格式为 urlencoded时,.POST才有数据
print(request.POST)
# 3. get()只能获取单个值
user = request.POST.get("username")
pwd = request.POST.get("pwd")
print(user, pwd)
# 4. getlist() 获取多个值
hobby = request.POST.getlist("hobby")
print(user, pwd, hobby)
return HttpResponse('ok')
- GET请求如何获取数据
from django.shortcuts import render, HttpResponse
# Create your views here.
def index(request):
# 2.发生GET请求时获取数据
print(request.GET) # <QueryDict: {'name': ['zp'], 'pwd': ['123']}>
return HttpResponse('ok')
- 获取请求路径
# 3.获取请求路径
print(request.path) # /users/index/
print(request.get_full_path()) # /users/index/?name=zp&pwd=123
- 获取请求头数据
# 4.获取请求头数据
print(request.META)
print(request.META.get("HTTP_HOST"))
3.3 响应对象
- HttpResponse()对象的属性
# 3.HttpResponse()对象属性
"""
# 3.1 设置响应内容
# return HttpResponse('ok')
# 3.2 设置状态码status=xxx
# return HttpResponse("您访问的资源不存在", status=404)
# 3.3 设置返回文本类型
# return HttpResponse("<h1>OK</h1>", content_type="text/plain")
"""
# 4.自定义响应头
"""
res = HttpResponse("OK")
res["user"] = "yuan"
return res
"""
- JsonResponse()
# 5.响应json数据
"""
book = {"title": "西游记", "price": 99}
return JsonResponse(book)
"""
# 6.序列化一个列表数据
books = [{"title": "西游记", "price": 99}, {"title": "三国演义", "price": 299}]
return JsonResponse(books, safe=False)
- render()
# 7.render()函数,把数据渲染至页面
# print(request.META)
# 获取请求头中的端口号,并在html文件中展示
REMOTE_ADDR = request.META.get("REMOTE_ADDR")
return render(request, "users/index.html", {"ip": REMOTE_ADDR})
- redirect()
目的:从一个页面跳转至另一个页面
- 重定向小案例
# 8.实现一个简单的用户登录功能
def login(request):
return render(request, "users/login.html")
def auth(request):
user = request.POST.get("user")
pwd = request.POST.get("pwd")
# print(user, pwd)
if user == "zp" and pwd == "123":
# return HttpResponse("验证通过")
# 返回动态页面使用重定向,静态使用render
return redirect("/users/index/")
else:
# return HttpResponse("用户名或密码错误")
# return redirect("/users/login/")
msg = "用户名或密码错误"
return render(request, "users/login.html", {"msg": msg})
4. 反向解析
目标:解决
超链接跳转
以及重定向
时路径不灵活的问题
- 给路径设置专属名字,当路径改变时,可以通过名字找到
应用文件中的urls.py
path('index', index, name='ind')
path('order', order, name='ord')
- 超链接跳转
<a href="{% url 'ord '%}">我的订单</a>
- 重定向
from django.urls import reverse
def login(request):
path = reverse("ind")
return redirect(path)