Django - 视图层 - 视图函数及快捷方式

目录

  • 简单的视图
  • 自定义各种错误页面
  • 异步视图
  • 内置的快捷方法
    • render()
    • redirect()
    • get_object_or_404()
    • get_list_or_404()
  • 视图装饰器
    • require_http_methods()
  • serve()视图

简单的视图

返回当前日期和时间作为HTML文档的视图

from django.http import HttpResponse
import datetime

def current_time(request):
	now = datetime.datetime.now()
	html = '

It is now %s.

'
% now return HttpResponse(html)
  • 首先从django.http模块导入了HttpResponse类, 以及Python的datetime
  • 然后定义了current_time视图函数
  • 每个视图函数都接收一个HttpRequest对象作为第一位置参数, 一般取名为request.
  • 该视图返回一个HttpResponse对象, 其中包含生成的HTML页面.

自定义各种错误页面

首先在根URLconf中额外增加错误页面的条目

from django.contrib import admin
from django.urls import path
from app import views

...

# 增加的条目
handler400 = views.bad_request
handler403 = views.permission_denied
handler404 = views.page_not_found
handler500 = views.error

app/views.py

from django.shortcuts import render
from django.views.decorators.csrf import requires_csrf_token

@requires_csrf_token
def bad_request(request, exception):
	return render(request, '400.html')

@requires_csrf_token
def permission_denied(request, exception):
	return render(request, '403.html')

@requires_csrf_token
def page_not_found(request, exception):
	return render(request, '404.html')

@requires_csrf_token
def error(request, exception):
	return render(request, '500.html')

然后根据自己的需求, 创建对应的400,403,404,500四个页面.

只有当DEBUG设置为False时, 这些错误视图才会被自动执行

异步视图

Django3.1开始支持异步视图函数
编写异步视图函数, 只需要用Python的async def 关键字语法

from django.http import HttpResponse
import datetime

async def current_time(request):
	now = datetime.datetime.now()
	html = '

It is now %s.

'
% now return HttpResponse(html)

内置的快捷方法

render()

render(request, template_name, context=None, content_type=None, status=None, using=None)

结合一个给定的模板给一个给定的上下文字典, 返回一个渲染后的HtppResponse对象
必要参数 :

  • request : 视图函数处理的当前请求
  • template_name : 要使用的模板的完整名称或者模板名称的列表, 如果是一个列表, 将使用其中能够查找到的第一个模板

可选参数

  • context : 添加到模板上下文的一个数据字典. 使用Python内置的locals()方法, 可以将函数作用域内的所有变量一次性添加进去
  • content_type : 用于生成的文档的MIME类型, 默认为’text/html’.
  • status : 响应的状态码. 默认为200
  • using : 用于加载模板使用的模板引擎的NAME

redirect()

redirect(to, args, permanent=False, *kwargs)

根据传递进来的url参数, 返回HttpResponseRedirect

参数to可以是 :

  • 一个模型实例 : 将调用模型的get_absolute_url()函数, 反向解析出目的url.
  • URL的name名称 : 可能带有参数 : reverse()将用于反向解析url.
  • 一个绝对的或相对的URL : 将原封不动的作为重定向的目标位置.

示例 :

  • 调用对象的get_absolute_url()方法来重定向URL
from django.shortcuts import redirect

def my_view(request):
	obj = MyModel.objects.get(...)
	return redirect(obj)
  • 传递URL的name名称, 内部会自动使用reverse()方法反向解析url.
def my_view(request):
	return redirect('index_name', foo='bar')

get_object_or_404()

get_objects_or_404(klass, args, **kwargs)
  • klass : 要获取的对象的Model类名或者Queryset等.
  • **kwargs : 查询的参数

查询某个对象, 找到了则进行下一步处理, 没找到则返回404

示例 :

  • 从MyModel中使用主键1获取对象
from django.shortcuts import get_object_or_404

def my_view(request):
	return get_object_or_404(MyModel, pk=1)
  • 还可以传递一个QuerySet实例
get_object_or_404(Book, title__startswith='M', pk=1)

get_list_or_404()

返回一个给定模型管理器上filter()的结果, 并将结果映射为一个列表, 如果结果为空则弹出Http404异常

示例 :
从MyModel中获取所有发布出来的对象

from djang.shortcuts import get_list_or_404

def my_view(request):
	my_objects = get_list_or_404(MyModel, published=True)

视图装饰器

require_http_methods()

用于限制可以访问该视图的HTTP方法

from django.viewsdecorators.http import require_http_methods

@require_http_methods(["GET", "POST"])
def my_view(request):
	....

serve()视图

用户上传的图片,文件等, 统称为MEDIA

为了方便在开发过程中, 对MEDIA资源的使用和测试, Django内置了一个serve()视图, 帮我们实现了通用的功能.

serve()视图只能用于开发环境

使用步骤 :

根路由urls

from django.conf import settings
from django.urls import re_path
from djang.views.static import serve

if setting.DEBUG:
	urlpatterns += [
		re_path(r'^media/(?P.*)$', serve, {
     
			'document_root': settings.MEDIA_ROOT,
		}),
	]

在settings中添加下面的配置

MEDIA_URL = '/media/'
MEDIA_ROOT = '/media/'

在Django项目的根目录下, 新建一个media文件夹, 将MEDIA资源放进去.

你可能感兴趣的:(Django进阶,python)