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页面作为响应体。
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函数和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()), # 讲类试图注册进来 ]
.