python学习笔记(91) Django基础之视图

时间:2022-04-25 20:22:53

1. 视图(接收请求返回响应那部分)
1. CBV(class base view)和FBV(function base view)
CBV:
  from django.views import View
  class AddPublisher(View):
  def get(self, request):
    pass
  def post(self, request):
    pass

url(r'^add_publisher/', views.AddPublisher.as_view())

2. request对象
  1. 之前学过的
    1. request.method --> 获取请求的方法(GET、POST等)
    2. request.GET --> 通常用来获取URL里面的参数
      127.0.0.1:8000/edit_book/?id=1&name=yimi
      request.GET --> {"id":1, "name":"yimi"}
      request.GET.get("id")
    3. request.POST --> 用来获取POST提交过来的数据
      request.POST.get("book_name")
  2. 补充其他常用的:
    1. request.path_info --> 获取用户请求的路径(不包含IP和端口和URL参数)
    /add_publisher/
    2. request.body
    POST的数据(字节类型)
    3.request.FILES
    上传的文件

3. response
基础必备三件套(求学要严谨)
  1. HttpResponse --> 返回字符串内容
  2. render --> 返回一个html页面
  3. redirect --> 返回一个重定向(告诉浏览器再去访问另外的网址)

4. JsonResponse
  from django.http import JsonResponse
  return JsonResponse(data) # 不设置safe=False的话只能接收字典格式

2. 路由系统(urls.py) http://www.cnblogs.com/liwenzhou/p/8271147.html
  1. 正则表达式的模糊匹配 # 匹配到的永远是字符串类型
  2. 分组匹配 --> 相当于给视图函数传递位置参数
    url(r'^book/([0-9]{2,4})/([a-zA-Z]{3})', views.book)

    url(r'^publisjer_delete/([0-9]+)$', views.publisher_delete),
    def publisher_delete(request, del_id)
  3. 分组命名匹配 --> 相当于给视图函数传递关键字参数
    url(r'^(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/', views.date)
    (两个不要混合使用)

---------------------------- 这里是坎 ------------------------------------

4. 反向解析URL
本质上就是给url匹配模式起别名,然后用过别名拿到具体的URL路径

  1. 怎么起别名?
  在url匹配模式中,定义name="别名"
  2. 如何使用?
    1. 在模板语言(html)里面使用:
      {% url "别名" %} --> 得到具体的URL路径
    2. 在视图中如何使用:
      from django.urls import reverse
      reverse("别名") --> 得到具体的URL路径
      redirect()
  3. 如何传参数?(分组命名匹配)
    1. 模板语言中:
      {% url "别名" 2018 "nb" %}
    2. 视图函数中
      传位置参数:
      reverse("别名", args=(2018, "nb"))

    传关键字参数:
      reverse("别名" kwargs={"year": 2018, "title": "nb"})
  4. namespace
    为了防止不同的app下面的url匹配模式有重复的别名

    url(r'^car/', include(app01_urls, namespace="car"))

    {% url 'car:home'%}

  5.使用include包含其他的url(二级路由)
    from app01 import views, urls
    url(r'^app01/', include(urls)), # 所有以app01开头的url都交给app01/urls.py来处理