@什么是视图
- 视图层=路由表(urls.py)+视图函数(views.py)
- 其角色相当于MVC中的Controller;
- 其职能是协调models和Template的关系,并解除其耦合;
- 过程:
○ 路由表接收用户请求,并分配给相应的视图函数进行处理
○ 视图函数调用模型获取数据
○ 视图函数将数据交给模板渲染
○ 视图函数将渲染结果返回给客户端
@路由定义
- 定义路由表响应函数
# 将指定路由交由指定函数进行处理
# 当前函数被命名为'hehe'(用于后续反向解析)
url(r'^hehe/(\d+)/', views.hehe_user, name='hehe')
- 将特定路由派发给子路由表
# 将所有/app/xxx派发给App下的urls.py处理
# namespace='app',该子路由表被命名为'app'
url(r'^app/', include('App.urls', namespace='app'))
- 【反向解析】= 得到【指定路由表】中的【指定函数】对应的【url路由】
@路由参数
- 普通参数规则
○ 在url匹配规则中使用括号
○ url规则中有多少括号,响应函数的request参数后就要有多少参数
○ 一一对应,按位置对应(位置参数)
○ 写法(\正则) - 普通参数示例
url(r'^hehe/(\d+)/', views.hehe_user, name='hehe')
def hehe_user(request, user_id):
- 关键字参数规则
○ 关键字参数 (?P\正则 ) ,P代表params
○ 需要和视图函数的参数 (year),按照名称匹配 - 关键字参数示例
url(r'^getdate/(?P<month>\d+)/(?P<day>\d+)/(?P<year>\d+)', views.get_date, name='getdate')
def get_date(request, year, month, day)
反向解析路径
○ namespace:路由文件urls.py注册的名字
○ name:路由函数注册的名字
# 模板中写法
{% url 'namespace:name' value1 value2 ...%}
{% url 'namespace:name' key=value key=value ...%}
# 代码中写法
reverse('namespace:name', args=(value1,value2...))
reverse('namespace:name', kwargs={key:value, key: value})
@返回响应
- 渲染页面并返回
# 以HttpResponse形式返回渲染结果
return HttpResponse(result)
# 直接在响应中给页面内容
return HttpResponse("<h1>HelloWorld</h1>")
# 直接返回渲染结果
return render(request, 'Hello.html')
# 渲染模板时传递数据
return render(request, 'AnimalList.html', context={"animals": animals, "data": data_dict})
- 请求重定向
return HttpResponseRedirect("/app/wahaha/123/")
return HttpResponseRedirect(reverse("app:haha",args=(123,)))
return HttpResponseRedirect("/four/getdate/4/1/2018/")
return HttpResponseRedirect(reverse("two:getdate", kwargs={"year":"2019","month":"11", "day":"11"}))
- 返回JSON数据
return JsonResponse({"msg": "ok", "status": "200", "data": "精神一下"})
- 用途
○ 响应前端AJAX请求
○ 为移动端APP返回数据
@Request对象
- 请求对象
- 视图函数中的第一个参数
- 是由Django框架根据用户的请求信息,为开发者自动创建的一个对象
- 包含了请求的所有信息
- 例如:请求路径path、请求方法method、请求编码encoding、请求参数GET、请求参数POST、文件参数FILES、会话对象COOKIES、session、是否阿贾克斯is_ajax、元信息META,等
- 用法举例
# 判断请求方式是否为GET
if request.method == "GET":
# 获得GET请求携带的数据
goodsid = request.GET.get("goodsid")
# 获得POST请求携带的数据
username = request.POST.get("username")
# 获取上传的文件对象
icon = request.FILES.get("icon")
# 设置和获取session键值
request.session["user_id"] = user.id
user_id = request.session.get("user_id")
# 清空session
request.session.flush()
@Response对象
- 响应对象
- 由开发者自己创建
- 服务器和客户端交流的方式
- 返回内容分类
○ 直接返回页面内容:HttpResponse或render
○ 重定向:HttpResponseRedirect或redirect
○ 返回Json数据:JsonResponse - 属性和方法例如:响应内容content,响应编码charset,响应代码status_code,内容类型content-type,向响应中入内容write(),清空响应内容flush(),等
@错误页面定制
- 关闭DEBUG模式
- 想要覆盖哪个错误,就书写相应的HTML,例如:
○ 404.html
○ 502.html