视图层

1. Django中的视图函数

函数视图主要写一些逻辑函数,函数视图主要分为两种:

1、FBV  function based view  写函数处理逻辑
2、CBV  class based view  通过类处理逻辑

1.1 一个简单的视图函数

面是一个以HTML文档的形式返回当前日期和时间的视图

from django.http import HttpResponse
import datetime

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

让我们来逐行解释下上面的代码:

  • 首先,我们从 django.http模块导入了HttpResponse类,以及Python的datetime库。

  • 接着,我们定义了current_datetime函数。它就是视图函数。每个视图函数都使用HttpRequest对象作为第一个参数,并且通常称之为request

    注意,视图函数的名称并不重要;不需要用一个统一的命名方式来命名,以便让Django识别它。我们将其命名为current_datetime,是因为这个名称能够比较准确地反映出它实现的功能。

  • 这个视图会返回一个HttpResponse对象,其中包含生成的响应。每个视图函数都负责返回一个HttpResponse对象。

       Django使用请求和响应对象来通过系统传递状态。

       当浏览器向服务端请求一个页面时,Django创建一个HttpRequest对象,该对象包含关于请求的元数据。然后,Django加载相应的视图,将这个HttpRequest对象作为第一个参数传递给视图函数。

       每个视图负责返回一个HttpResponse对象。

1.2  CBV和FBV

常见的几种提交方式
    get    :请求数据
    post   :提交数据
    delete :删除数据
    put    :更新数据
    patch  :更新部分数据

【注意】

  1. form表单提交 只支持get、post

  2. ajax支持所有

 

 

1.2.1 FBV

# FBV版添加班级
def add_class(request):
    if request.method == "POST":
        class_name = request.POST.get("class_name")
        models.Classes.objects.create(name=class_name)
        return redirect("/class_list/")
    return render(request, "add_class.html")

1.2.2 CBV

from django.views import View
class Login(View):
    def dispatch(self, request, *args, **kwargs):
        super(Login, self).dispatch(request, *args, **kwargs)
        # 自定制逻辑
        
    def get(self):
        return render(request, "add_class.html")

    def post(self):
        class_name = request.POST.get("class_name")
        models.Classes.objects.create(name=class_name)
        return redirect("/class_list/")

# 如果是get提交就进入get函数,post提交就进入post函数
# 底层走的是dispatch函数,他会根据你的提交方式分发到不同函数里
# 我们也可以重写这个方法,加入一些其他限制,例如限制ip等等

2. Request对象

2.1 请求相关的方法

path_info    # 返回用户访问url,不包括域名
method      # 请求中使用的HTTP方法的字符串表示,全大写表示。
GET           # 包含所有HTTP  GET参数的类字典对象
POST         # 包含所有HTTP POST参数的类字典对象
body          # 请求体,byte类型 request.POST的数据就是从body里面提取到的
FILLES       # 获取文件

【注意】

注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:

request.POST.getlist("hobby")

2.2 案例演示

def upload(request):
    """
    保存上传文件前,数据需要存放在某个位置。默认当上传文件小于2.5M时,django会将上传文件的全部内容读进内存。从内存读取一次,写磁盘一次。
    但当上传文件很大时,django会把上传文件写到临时文件中,然后存放到系统临时文件夹中。
    :param request: 
    :return: 
    """
    if request.method == "POST":
        # 从请求的FILES中获取上传文件的文件名,file为页面上type=files类型input的name属性值
        filename = request.FILES.get('file')
        # 在项目目录下新建一个文件
        with open(filename, "wb") as f:
            # 从上传的文件对象中一点一点读
            for chunk in request.FILES["file"].chunks():
                # 写入本地文件
                f.write(chunk)
        return HttpResponse("上传OK")
方法

3. Response对象

响应对象主要有三种形式:

    HttpResponse()
    render()
    redirect()

3.1 HttpResponse()

HttpResponse()括号内直接跟一个具体的字符串作为响应体

from django.http import HttpResponse
response = HttpResponse("Here's the text of the Web page.")
response = HttpResponse("Text only, please.", content_type="text/plain")

3.2 render()

from django.shortcuts import render

def my_view(request):
    # 视图的代码写在这里
    return render(request, 'myapp/index.html', {'foo': 'bar'})

3.3 redirect()

参数可以是:

  • 一个模型:将调用模型的get_absolute_url() 函数
  • 一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称
  • 一个绝对的或相对的URL,将原封不动的作为重定向的位置。

默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。

 

【最常用的参数为一个url】

def my_view(request):
    ...
    return redirect('/some/url/')

 

【了解】

传递一个具体的ORM对象

from django.shortcuts import redirect
 
def my_view(request):
    ...
    object = MyModel.objects.get(...)
    return redirect(object)

传递要重定向到的一个具体的网址

def my_view(request):
    ...
    return redirect('http://example.com/')

传递一个视图的名称

def my_view(request):
    ...
    return redirect('some-view-name', foo='bar')

 

4. JsonResponse

JsonResponse是HttpResponse的子类,专门用来生成JSON编码的响应。

# 第一种方式
    import json
    data={'name':'lqz','age':18}
    data1=['lqz','egon']
    return HttpResponse(json.dumps(data1))

# 第二种方式
    from django.http import JsonResponse
    # data = {'name': 'lqz', 'age': 18}
    data1 = ['lqz', 'egon']
    return JsonResponse(data)
    return JsonResponse(data1,safe=False)  # 默认只能传递字典类型,如果要传递非字典类型需要设置一下safe关键字参数。

 

posted on 2019-08-02 21:50  软饭攻城狮  阅读(115)  评论(0编辑  收藏  举报

导航