Django 的视图层,类视图

什么是视图:

之前我们也了解了urls路由 那么路由的主要作用是决定你下一步走哪个视图函数 ,视图就是用来存放一个个的函数的python文件,主要存储的函数就是你Django主要的流程的控制 都存放在一起就称这个文件为视图views

视图层之视图函数(views):

 

一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你的Python目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名为views.py的文件中。

一个简单的视图函数

-----views.py

from django.shortcuts import render,HttpResponse
from django.urls import reverse
import time
# Create your views here.
def timer(request):  #request这个参数必须有 因为你的url路由分配的时候会默认将请求信息传递进来request就是接受所有的请求信息的
    ctime = time.time()#时间戳
    s = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(ctime))
    # return HttpResponse()  #HttpResponse 的里面放置的必须是字符串
    return render(request,'time.html',{'t':s})

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

 

让我们逐行阅读上面的代码:

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

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

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

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

HttpRequest对象

属性:

'''
path:       请求页面的全路径,不包括域名

method:     请求中使用的HTTP方法的字符串表示。全大写表示。例如

               if  req.method=="GET":

                         do_something()

               elif req.method=="POST":

                         do_something_else()

GET:         包含所有HTTP GET参数的类字典对象

POST:       包含所有HTTP POST参数的类字典对象

COOKIES:     包含所有cookies的标准Python字典对象;keys和values都是字符串。

FILES:      包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中
             name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:

             filename:      上传文件名,用字符串表示
             content_type:   上传文件的Content Type
             content:       上传文件的原始内容


user:       是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前
             没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你
             可以通过user的is_authenticated()方法来辨别用户是否登陆:
             if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
             时该属性才可用

session:    唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。

'''

 

HttpResponse对象:

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

  • HttpResponse()
  • render()
  • redirect()

 

代码展示

url:

  

from django.urls import path
from django.urls import path,include
from .views import index
urlpatterns = [
    path('index/', index ),
]

 

 

 

view

from django.shortcuts import render  

from django.http import HttpResponse, HttpRequest  #导入http模块的httpresponse
# Create your views here.


def index(request):
    return HttpResponse("This is bookmanageTestone's index")

 

这样访问url既可以分发到view中的index方法中

 

 

HttpResponse()括号内直接跟一个具体的字符串作为响应体,比较直接很简单,所以这里主要介绍后面两种形式。

render()

1
2
3
render(request, template_name[, context])
 
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
参数:
     request: 用于生成响应的请求对象。

     template_name:要使用的模板的完整名称,可选的参数

     context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。

render方法就是将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面作为响应体。
render 是直接找到这个页面 不用再次经过urls
 
 
   print(request.method)  # 请求方式
    print(request.path)    # 这次请求路径
    print(request.GET)     # GET请求的请求数据   QueryDict  {}
    print(request.POST)    # POST请求的请求数据  QueryDict  {}
    print(request.get_full_path()) # 包含GET请求参数的请求路径
    print(request.is_ajax()) # 返回布尔值

 

 
 

redirect()

是重定向

def login(request):
    print('111')
    if request.method == 'POST':
          user = request.POST.get('user')
          pwd = request.POST.get('pwd')
          if user == '老王' and pwd == '123':
              return redirect('/index/')  #如果条件满足直接定向到index这函数内执行views内的index
    return render(request,'login.html')

 

 

render 和 redirect 的区别:

render 是直接找到这个页面 不用再次经过urls
而 redirect 需要再次经历一次urls render 是一次响应 redirect 是再相浏览器访问然后再次经历一次urls 所以这个区别还是很区别的
 

render函数和redirect函数的区别

render:只会返回页面内容,但是未发送第二次请求

redirect:发挥了第二次请求,url更新

具体实例说明

render:

redirect:

 

 
 

 重定向就是在这个网站找不到信息了 定向到另一个网站去找信息

 

类试图:

类试图的定义

面向对象

类视图 是采用的面向对象的思路

1.定义类试图
① 继承自 View (from django.views import View)
② 不同的请求方式 有不同的业务逻辑
类试图的方法 就直接采用 http的请求方式的名字 作为我们的函数名.例如: get ,post,put,delete
③ 类试图的方法的第二个参数 必须是请求实例对象
类试图的方法 必须有返回值 返回值是HttpResopnse及其子类

2.类试图的url引导

 

from django.views import View
class 类试图的名字(View):
    def get(self, request):
        return HttpResponse('xxxx')
    def post(self, request):
        return HttpResponse('xxx')
        
1、继承自django的View
2、类试图种的方法是采用http方法小写赖区分不同的请求方式

 

eg:

app/views.py

from django.views import View

class MentodView(View):
    # 类视图
    def get(self, request):
        print("this is get ")
        return HttpResponse("This is 类视图中的get请求")
    def post(self,request):
        print("this is post")
        return HttpResponse("This is 类视图中的post请求")

 

app/urls.py

urlpatterns = [

    path('test_view/', MentodView.as_view()),  # 讲类试图注册进来

]

 

 

 

 

.

posted @ 2018-06-25 16:28  可爱的红领巾  阅读(182)  评论(0编辑  收藏  举报