vnsc5858威尼斯城官网 > vnsc5858威尼斯城官网 > vnsc5858威尼斯城官网:Django视图

原标题:vnsc5858威尼斯城官网:Django视图

浏览次数:175 时间:2019-10-02

Django的View(视图)

二个视图函数(类),简称视图,是贰个粗略的Python 函数(类),它接受Web诉求而且重回Web响应。

一呼百应得以是一张网页的HTML内容,三个重定向,贰个404指鹿为马,叁个XML文档,恐怕一张图纸。

任由视图本身包罗哪些逻辑,都要赶回响应。代码写在哪儿也不在意,只要它在您眼下项目目录上边。除此而外没有越来越多的渴求了——能够说“未有怎么奇妙的地点”。为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名字为views.py的文书中。

Django的View(视图)

二个视图函数(类),简称视图,是多个简约的Python 函数(类),它承受Web恳求况兼重临Web响应。

一呼百应得以是一张网页的HTML内容,贰个重定向,二个404错误,一个XML文书档案,恐怕一张图纸。

任凭视图本人带有怎样逻辑,都要赶回响应。代码写在哪个地方也不在乎,只要它在你眼下项目目录上面。除外未有越来越多的供给了——能够说“未有啥巧妙的地方”。为了将代码放在某处,我们约定成俗将视图放置在品种(project)或应用程序(app)目录中的名叫views.py的文本中。

三个简便的视图

上面是多少个以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对象。

二个总结的视图

上边是四个以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对象。

FBV和CBV

依赖函数的view,就叫FBV。基于类的view,就叫CBV。

增添班级示例:

CBV和FBV

笔者们事先写过的都以基于函数的view,就叫FBV。还可以把view写成基于类的。

就拿我们前面写过的丰硕班级为例:

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")

 

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")

CBV版:

# CBV版添加班级
from django.views import View


class AddClass(View):

    def get(self, request):
        return render(request, "add_class.html")

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

注意:

vnsc5858威尼斯城官网 ,利用CBV时,urls.py中也做相应的改造:

# urls.py中
url(r'^add_class/$', views.AddClass.as_view()),

CBV版:

# CBV版添加班级
from django.views import View


class AddClass(View):

    def get(self, request):
        return render(request, "add_class.html")

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

注意:

行使CBV时,urls.py中也做相应的修改:

# urls.py中
url(r'^add_class/$', views.AddClass.as_view()),

给视图加装饰器

给视图加装饰器

选用装饰器装饰FBV

FBV本人正是贰个函数,所以和给普通的函数加装饰器无差:

def wrapper(func):
    def inner(*args, **kwargs):
        start_time = time.time()
        ret = func(*args, **kwargs)
        end_time = time.time()
        print("used:", end_time-start_time)
        return ret
    return inner


# FBV版添加班级
@wrapper
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")

使用装饰器装饰FBV

FBV自己便是叁个函数,所以和给平日的函数加装饰器无差:

def wrapper(func):
    def inner(*args, **kwargs):
        start_time = time.time()
        ret = func(*args, **kwargs)
        end_time = time.time()
        print("used:", end_time-start_time)
        return ret
    return inner


# FBV版添加班级
@wrapper
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")

动用装饰器装饰CBV

# CBV版添加班级
from django.views import View
from django.utils.decorators import method_decorator

class AddClass(View):

    @method_decorator(wrapper)
    def get(self, request):
        return render(request, "add_class.html")

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

vnsc5858威尼斯城官网 1vnsc5858威尼斯城官网 2

# 使用CBV时要注意,请求过来后会先执行dispatch()这个方法,如果需要批量对具体的请求处理方法,如get,post等做一些操作的时候,这里我们可以手动改写dispatch方法,这个dispatch方法就和在FBV上加装饰器的效果一样。

class Login(View):

    def dispatch(self, request, *args, **kwargs):
        print('before')
        obj = super(Login,self).dispatch(request, *args, **kwargs)
        print('after')
        return obj

    def get(self,request):
        return render(request,'login.html')

    def post(self,request):
        print(request.POST.get('user'))
        return HttpResponse('Login.post')

有关CBV的增添阅读

利用装饰器装饰CBV

类中的方法与独立函数不胜数全同样,由此不可能直接将函数装饰器应用于类中的方法 ,大家须要先将其转移为艺术装饰器。

Django中提供了method_decorator装饰器用于将函数装饰器调换为格局装饰器。

# CBV版添加班级
from django.views import View
from django.utils.decorators import method_decorator

class AddClass(View):

    @method_decorator(wrapper)
    def get(self, request):
        return render(request, "add_class.html")

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

vnsc5858威尼斯城官网 3vnsc5858威尼斯城官网 4

# 使用CBV时要注意,请求过来后会先执行dispatch()这个方法,如果需要批量对具体的请求处理方法,如get,post等做一些操作的时候,这里我们可以手动改写dispatch方法,这个dispatch方法就和在FBV上加装饰器的效果一样。

class Login(View):

    def dispatch(self, request, *args, **kwargs):
        print('before')
        obj = super(Login,self).dispatch(request, *args, **kwargs)
        print('after')
        return obj

    def get(self,request):
        return render(request,'login.html')

    def post(self,request):
        print(request.POST.get('user'))
        return HttpResponse('Login.post')

有关CBV的扩充阅读

Request对象和Response对象

Request对象和Response对象

request对象

当一个页面被呼吁时,Django就会创设三个包含这次乞求原消息的HttpRequest对象。
Django会将这么些指标活动传送给响应的视图函数,经常视图函数约定俗成地利用 request 参数字传送承那么些目的。

 

合希伯来语档

request对象

当一个页面被呼吁时,Django就能够创设二个包蕴本次须要原消息的HttpRequest对象。
Django会将那么些指标活动传递给响应的视图函数,平时视图函数约定俗成地接纳request 参数承袭这么些指标。

 

法定文档

伸手相关的常用值

  • path_info     重返客商访谈url,不包含域名
  • method        央求中应用的HTTP方法的字符串表示,全大写表示。
  • GET              包罗全体HTTP  GET参数的类字典对象
  • POST           包蕴全数HTTP POST参数的类字典对象
  • body            央求体,byte类型 request.POST的多寡正是从body里面提取到的

呼吁相关的常用值

  • path_info     重回客户访谈url,不富含域名
  • method        伸手中选拔的HTTP方法的字符串表示,全大写表示。
  • GET              包罗全部HTTP  GET参数的类字典对象
  • POST           带有全部HTTP POST参数的类字典对象
  • body            诉求体,byte类型 request.POST的数目就是从body里面提取到的

本文由vnsc5858威尼斯城官网发布于vnsc5858威尼斯城官网,转载请注明出处:vnsc5858威尼斯城官网:Django视图

关键词:

上一篇:vnsc5858威尼斯城官网基本原理与核心知识,Flask开

下一篇:没有了