Django入门教程

前言

第一章: django快速入门

第二章: django MTV架构

第三章: django视图

第四章: django模板

第五章: django模型

第六章: django后台管理系统

第七章: 项目实战-简易的博客系统

第八章:django表单

第九章:django用户认证系统

第十章:django中的会话

第十一章:django安全

第十二章:django性能优化

第十三章:django实用工具

首页 > Django入门教程 > 第三章: django视图 > 3.3节: 类类型视图

3.3节: 类类型视图

薯条老师 2020-07-18 14:56:27 254779 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6

3.3.1 类类型视图

定义类类型视图,需要从View类中进行继承,从django.views中可以导出View类。类视图的定义语法:

class ViewName(View):    
    def get(self, request):        
        return HttpResponse()     
    
    def post(self, request):        
        return HttpResponse()

ViewName表示定义的类视图名称,类视图中的request参数以及HttpResponse对象同函数视图,笔者不再赘述。类视图与函数视图的区别在于:

(1) 在函数视图中,需通过HttpRequest的method字段来区分http协议的GET和POST等方法,在类视图中,直接定义get方法来对http get请求进行处理,定义post方法来http post请求进行处理。

(2) 在urls.py中定义url与视图的路由,如果视图为类类型,则需要通过类视图的as_view方法来进行转换,以调用在类视图中定义的处理方法。

例如浏览器向服务器发起http get请求, django收到请求后执行视图类的as_view方法,该方法会返回在类视图中定义的get方法,然后对get请求进行处理。感兴趣的读者,可以查阅django的源代码。

类视图的代码实例:

class Greeting(View):    
    greeting = "Hello Django"    
    def get(self, request):        
        return HttpResponse(self.greeting)

在上文的代码中定义了一个Greeting的类视图,类属性greeting的值为Hello Django,在get方法中将greeting的值响应给客户端。对于类属性值,可通过视图类as_view方法中的同名关键字参数,来进行覆盖。urls.py中的代码实例:

path('greeting/', blog.Greeting.as_view(greeting="Hello Python"))

3.3.2 响应HTML给浏览器

现在通过类类型视图,根据客户端的查询请求来响应不同的html文本,请读者按照以下步骤来进行操作:

(1) 打开chipscoco下的views.py,新增Html类视图

from django.shortcuts import render
from django.views import View
from django.http import HttpResponse
 
# Create your views here.


class Home(View):
    def get(self, request):
        greeting = request.GET.get('greeting', 'Django')
        return render(request, "blog/home.html", {"greeting": greeting})
 

def arithmetic(request):
    if request.method == "GET":
        action = request.GET.get('action', '+')
        a = int(request.GET.get('a', 0))
        b = int(request.GET.get('b', 0))
 
        if action == "+":
            result = a + b
        elif action == "-":
            result = a-b
        elif action == "*":
            result = a*b
        else:
            result = 0 if b == 0 else a / b
 
        return HttpResponse(str(result))
 
 
# 新增的视图类Html
class Html(View):
    
    title = "根据客户端的查询请求来响应不同的html"
    
    """
    查询参数携带在url中,所以是对客户端的http get请求进行处理,对此不熟悉的读者,需要先学习下http协议
    """
 
    def get(self, request):
        """
        获取查询参数label,表示html标签,获取查询参数content,表示标签中的内容
        """
 
        label = request.GET.get('label', 'h1')
        content = request.GET.get('content', 'Hello Django')
        html = "<html><head><title>{0}</title></head><{1}>{2}</{1}></html>".format(self.title, label, content)
 
        # 响应html文本给浏览器
        return HttpResponse(html)

(2) 打开chips目录中的urls.py,定义url与Html视图的路由

更新后的代码为:

from django.contrib import admin
from django.urls import path
import blog.views as blog
 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', blog.Home.as_view()),
    path('arithmetic/', blog.arithmetic),

    # 新增的代码,类视图需要执行类方法as_view来进行转换
    path('html/', blog.Html.as_view()),
]

(3) 打开浏览器进行测试

使用浏览器进行测试时,需要先在命令行启动django服务器:python manage.py runserver 8080

打开浏览器,在地址栏中输入http://127.0.0.1:8080/html/?label=h2&content=Hello Python:

 image.png

在Html视图中,直接在代码中编写html代码,并将其响应给浏览器。这样的写法有一个很大的缺点,很难编写复杂的页面样式, 此外将html页面与视图层的业务逻辑进行耦合,一旦需要更改页面的样式,就需要对视图进行修改。视图层只需负责核心的业务逻辑,然后在必要时调用模板层的html页面进行响应,将业务层(视图)与表现层(模板)进行分离,更容易对项目进行扩展和维护,这也是MTV架构的意义所在。

 在团队开发中,视图层的代码逻辑由Python工程师进行负责,而将html页面的设计工作交给前端工程师。如果将页面的定义全部耦合在视图层,那么在团队协作中很难进行分工合作。在第四章的教程中会对django模板进行详细介绍。

3.3.3 最具实力的小班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,包拿Offer
(3) 数据分析高薪就业班,月薪11K-15K, 免费领取课程大纲
(4)
Python大数据挖掘,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取Python学习资料:


欢迎 发表评论: