一个视图函数(类),简称视图,是一个简单的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对象。
CBV和FBV
FBV :function based view 基于函数的视图
CBV:class based view 基于类的视图
基于FBV的视图
def add_grade(request): err_msg, new_name = '', '' if request.method == 'POST': new_name = request.POST.get('grade_name', '').strip() if not new_name: err_msg = '数据不能为空' obj_name = models.Grade.objects.filter(name=new_name) if obj_name: err_msg = '数据以存在' if new_name and not obj_name: models.Grade.objects.create(name=new_name) return redirect('/grade/') return render(request, 'add_grade.html', {'err_msg': err_msg, 'name': new_name})
基于CBV视图
from django.views import View class AddGrade(View): #可以更改 http_method_names中的内容,来确定可以提交那种请求, http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] # http_method_names = ['get', ] # 此时只能提交get请求了 def get(self,request): print('get') return render(request,'add_grade.html') def post(self,request): err_msg ='' new_name = request.POST.get('grade_name', '').strip() # 不能输入空格 if not new_name: err_msg = '数据不能为空' obj_name = models.Grade.objects.filter(name=new_name) if obj_name: err_msg = '数据以存在' if new_name and not obj_name: models.Grade.objects.create(name=new_name) return redirect('/grade/') return render(request, 'add_grade.html', {'err_msg': err_msg, 'name': new_name})
使用
url(r'^add_grade/', views.add_grade), #基于FBV视图 url(r'^add_grade/', views.AddGrade.as_view()), #基于CBV视图
添加装饰器
PBV :直接添加
CBV
from django.utils.decorators import method_decorator #加载某一个方法上 @method_decorator(timer) def get(self, request): #加载dispatch方法上面 class AddGrade(View): #可以更改 http_method_names中的内容,来确定可以提交那种请求, http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] # http_method_names = ['get', ] # 此时只能提交get请求了 @method_decorator(timer) #timer:装饰器名称 def dispatch(self, request, *args, **kwargs): super().dispatch(request,*args,**kwargs) def get(self, request): print('get') return render(request, 'add_grade.html') #加在类上 @method_decorator(timer, 'post') @method_decorator(timer, 'get') class AddPublisher(View):
requerst对象

print(request.method) # 请求方式 GET POST PUT print(request.GET) # URL携带的参数 { ‘name’: ['alex'] } [] .get('name') print(request.POST) # POST请求提交的数据 { ‘name’: ['alex'] } .getlist() print(request.path_info) # 路径信息 不包含ip和端口 参数 print(request.schene) #判断请求是否安全 https print(request.FILES) #上传文件 print(request.META) print(request.COOKIES) print(request.session) print(request.get_host()) print(request.get_full_path()) # 路径信息 不包含ip和端口 带参数 print(request.is_ajax()) # 判断是否是ajax请求
上传文件
<body> <form action="" method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="f1"> <button>上传</button> </form> </body>
def upload(request): if request.method == 'POST': f1 = request.FILES.get('f1') with open(f1.name,'wb') as f : for i in f1.chunks(): f.write(i) return HttpResponse('上传成功') return render(request,'upload.html')
JsonResponse
JsonResponse是HttpResponse的子类,专门用来生成JSON编码的响应。
from django.http import JsonResponse def json_data(request): data = {'id': 11, 'name': 'alex'} l1 = ['qwe', 'dasd'] return JsonResponse(l1) # Content-Type: application/json
默认只能传递字典类型,如果要传递非字典类型需要设置一下safe关键字参数
response = JsonResponse([1, 2, 3], safe=False)