day02 路由控制器

1. 路由分组

1.1 路由匹配规则

  1. urls.py与view.py中的路由匹配规则
  • 不允许一对多
  • 允许一对一、多对一
# 一对一、多对一
path('index/', get_time)
path('time/', get_time)

# 一对多 默认匹配第一个,不会重复访问后面的
path('index/', get_time)
path('index/', eat)

1.2 动态路由的使用

目的:把正则匹配的内容传至视图函数中

  • 注意简单分组和有名分组
  1. urls.py中导入re_path,使用该模块进行路径的正则匹配。
  2. 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应用中

  1. 首先,在项目的urls.py中建立映射关系
path('app/', include('app.urls'))
  1. 在app应用中创建urls.py,把所需路由写入该模块

3. request请求

3.1 请求逻辑

  1. 浏览器向服务端发送请求
  2. wsig.py把该请求封装成http格式的request对象,经由urls.py路由转发,把该对象传给view.py的形参request,进行业务处理;
  3. 返回响应后的数据,并交由wsig.py封装数据传输给浏览器。

3.2 请求对象

目的:request发送get和post请求时如何获取数据

  • 相应的属性和方法
  1. 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')

  1. 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')

  1. 获取请求路径
# 3.获取请求路径
    print(request.path)  # /users/index/
    print(request.get_full_path())  # /users/index/?name=zp&pwd=123
  1. 获取请求头数据

    # 4.获取请求头数据
    print(request.META)
    print(request.META.get("HTTP_HOST"))

3.3 响应对象

  1. 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
    """
  1. JsonResponse()
    # 5.响应json数据
    """
    book = {"title": "西游记", "price": 99}
    return JsonResponse(book)
    """

    # 6.序列化一个列表数据
    books = [{"title": "西游记", "price": 99}, {"title": "三国演义", "price": 299}]
    return JsonResponse(books, safe=False)
  1. render()
# 7.render()函数,把数据渲染至页面
    # print(request.META)
    # 获取请求头中的端口号,并在html文件中展示
    REMOTE_ADDR = request.META.get("REMOTE_ADDR")

    return render(request, "users/index.html", {"ip": REMOTE_ADDR})
  1. 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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萌面女汉_zp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值