Django之视图层views

1、视图函数

  就是一个简单的python函数,它接收web请求并返回web响应,如:

# 一个简单的视图函数
# views.py 文件下

from django.shortcuts import render, HttpResponse, redirect
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

2、视图函数返回的三个对象

返回函数
说明
示例
HttpResponse 
返回字符串
return HttpResponse("Hello World!!!")
render
支持模板语法,渲染页面,
并返回给前端
return render(
           request,
           "user.html",
           {"name": "sun", "age": 24}
)
redirect 
重定向(既可以定向别人的网址,又可以是自己的网址)
return redirect("/index/")
return redirect("www.baidu.com")

3、JsonResponse对象

  json格式数据(前后端之所以能分离是因为json数据格式做支撑)

  往前端返回数据有两种方式

import json
from django.http import JsonResponse

# 不包括中文汉字传输数据
lis = ("abc", 123, "123456")
dic = {"name": "sun", 'age': 24}
# 第一种方式
# return HttpResponse(json.dumps(lis))
# return HttpResponse(json.dumps(dic))

# 第二种方式:
return JsonResponse(lis, safe=False)  # safe=True, 只能字典传输,默认是True
return JsonResponse(dic)

# 结果是: ["abc", 123, "123456"]
# 结果是:{"name": "sun", "age": 24}

  若返回的json格式中有汉字如何解决

# 当出现汉字时:
lis = ("abc", 123, "123456", "孙小二")
dic = {"name": "孙小二", 'age': 24}

# 结果是:["abc", 123, "123456", "\u5b59\u5c0f\u4e8c"]
# 结果是:{"name": "\u5b59\u5c0f\u4e8c", "age": 24}

# 解决办法
# 第一种方式的解决办法:
return HttpResponse(json.dumps(lis, ensure_ascii=False))
return HttpResponse(json.dumps(dic, ensure_ascii=False))
# 说明:查看源码
# 点进json可以查看ensure_ascii的用处:
# Flase,返回的值就不包含ascii编码

# 第二种方式的解决办法:
return JsonResponse(lis, safe=False, json_dumps_params={"ensure_ascii": False})
return JsonResponse(dic, json_dumps_params={"ensure_ascii": False})
# 说明:查看源码
# 点进JsonResponse可以查看json_dumps_params的作用

# 结果是:["abc", 123, "123456", "孙小二"]
# 结果是:{"name": "孙小二", "age": 24}

 4、FBV与CBV

  FBV:基于函数的视图,即视图函数

  CBV:基于类的视图

CBV创建方式:
# 1.在路由层加入as_view
urlpatterns = [
    url(r"^login", view.login.as_view()),
]
# 在views.py下创建类
from django.views import View
class Login(View):
    def get(self, request):
        pass
    def post(self, request):
        pass
    def dispatch(self, request, *args, **kwargs):
        print("before")
        obj = super(Login, self).dispatch(request, *args, **kwargs)
        print("after")
        return obj
# dispatch 的作用:
# 执行url请求之前,先执行dispatch,使用反射getatter()进行请求分配。
# 在Login中增加自己的dispatch,起到类似于装饰器作用,可以自定义一些操作

# 描述CBV执行过程:
# 当URL请求经过路由系统时,就会立即执行Login.as_view()函数,as_view是一个闭包函数,
# 返回的是内部的view函数,请求到达视图层时,执行view()函数,即执行dispatch函数,
# dispatch函数内通过getattr反射,找到我们定义的get或post函数,并执行,最后返回请求响应

5、文件上传

  前端注意点:

    form表单method必须是post

    enctype必须是multipart/form-data

  后端:

    获取上传文件的对象:request.FILES.get("file_name")

    获取上传文件的文件名:request.FILES.get("file_name").name

示例:
# 获取文件对象,即文件句柄
file_obj = request.FILES.get('myfile')
# print(file_obj.name)
# 获取文件名
file_name = file_obj.name
# 文件读写操作
with open(file_name,'wb') as f:
    # for line in file_obj:
    for line in file_obj.chunks():0
        f.write(line)

6、request 属性

1.request.GET
    一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象。

2.request.POST
    一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。

    POST 请求可以带有空的 POST 字典 —— 如果通过 HTTP POST 方法发送一个表单,但是表单中没有任何的数据,QueryDict 对象依然会被创建。
    因此,不应该使用 if request.POST  来检查使用的是否是POST 方法;应该使用 if request.method == "POST"
    另外:如果使用 POST 上传文件的话,文件信息将包含在 FILES 属性中。
   
    注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:
        request.POST.getlist("hobby")


3.request.body
  一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。
  但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。


4.request.path,或request.path_info
  一个字符串,表示请求的路径组件(不含域名)。
  例如:url: "127.0.0.1:8080/login/", request.path的返回值"/login/"

5.request.get_full_path()
  一个字符串,表示请求的路径组件, 可以获取get方式传的参数
  例如:url: "127.0.0.1:8080/login/?id=1", request.get_full_path的返回值"/login/?id=1"


6.request.method
  一个字符串,表示请求使用的HTTP 方法。必须使用大写。
  例如:"GET""POST"


7.request.encoding
  一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。
   这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。
   接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。
   如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。


8.request.META
  一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器,下面是一些示例:
  取值:

    CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
    CONTENT_TYPE —— 请求的正文的MIME 类型。
    HTTP_ACCEPT —— 响应可接收的Content-Type。
    HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
    HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
    HTTP_HOST —— 客服端发送的HTTP Host 头部。
    HTTP_REFERER —— Referring 页面。
    HTTP_USER_AGENT —— 客户端的user-agent 字符串。
    QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
    REMOTE_ADDR —— 客户端的IP 地址。
    REMOTE_HOST —— 客户端的主机名。
    REMOTE_USER —— 服务器认证后的用户。
    REQUEST_METHOD —— 一个字符串,例如"GET""POST"。
    SERVER_NAME —— 服务器的主机名。
    SERVER_PORT —— 服务器的端口(是一个字符串)。
  从上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,请求中的任何 HTTP 首部转换为 META 的键时,
    都会将所有字母大写并将连接符替换为下划线最后加上 HTTP_  前缀。
    所以,一个叫做 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。


9.request.FILES
  一个类似于字典的对象,包含所有的上传文件信息。
   FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。
  注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会
   包含数据。否则,FILES 将为一个空的类似于字典的对象。


10.request.COOKIES
    一个标准的Python 字典,包含所有的cookie。键和值都为字符串。


11.request.session
  一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用。

 

  

posted @ 2019-04-30 09:50  yw_sun  阅读(132)  评论(0)    收藏  举报