快捷搜索:
来自 计算机编程 2019-09-17 12:10 的文章
当前位置: 67677新澳门手机版 > 计算机编程 > 正文

Django视图

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

注意:

应用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/")

图片 1图片 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/")

图片 3图片 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里面提取到的

本文由67677新澳门手机版发布于计算机编程,转载请注明出处:Django视图

关键词: