一、视图函数

1. 视图函数的第一个参数一定是一个HTTPRequest类型的对象,这个对象是Django自动创建的,具体形参名通常用request。通过这个对象,可以调用请求的一些参数,比如request.path,request.method,request.META去查看请求信息。

2. 视图函数必须返回一个HTTPResponse类型的对象。(也可以用JsonResponse,StreamingHttpResponse,FileResponse类返回非http对象

def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)

  实际使用中,通过加载视图模板的方式,将视图函数与前端显示层解耦。

from django.http import HttpResponse
from django.template import loader
from .models import Question def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
template = loader.get_template('polls/index.html')
context = {
'latest_question_list': latest_question_list,
}
return HttpResponse(template.render(context, request))

  但是这么写,视图函数的语法比较繁琐,所以引入快捷方式,render()函数。

from django.shortcuts import render
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list}
return render(request, 'polls/index.html', context)

  render()函数的第一个位置参数是请求对象,第二个位置参数是模板,还可以有一个可选的第三参数---一个字典,包含需要传递给模板的数据。最后render函数返回一个经过字典数据渲染过的模板封装而成的HttpResponse对象。

3. 对于视图函数中操作模型时,如果找不到模型的值会返回404错误。

from django.http import Http404
from django.shortcuts import render
from .models import Question
# ...
def detail(request, question_id):
try:
question = Question.objects.get(pk=question_id)
except Question.DoesNotExist:
raise Http404("Question does not exist")
return render(request, 'polls/detail.html', {'question': question})

  可以使用快捷方式,get_object_or_404()函数和get_list_or_404()函数(用来替代filter()函数,当查询列表为空时弹出404错误。)

from django.shortcuts import get_object_or_404, render
from .models import Question
# ...
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})

  将一个模型作为第一个位置参数,后面可以跟上任意个数的关键字参数(这些关键字参数是传递给模型管理器的get()函数的),如果对象不存在则弹出Http404错误。

4.HTTPResponse类有很多子类,可以返回不同状态的应答。

  HttpResponseRedirect 302

  HttpResponsePermanentRedirect 301

  HttpResponseNotModified 304

  HttpResponseBadRequest 400

   HttpResponseNotFound 404

  HttpResponseForbidden 403

  HttpResponseNotAllowed 405

  HttpResponseGone 410

  HttpResponseServerError 500

例如返回404:

from django.http import HttpResponse, HttpResponseNotFound

def my_view(request):
# ...
if foo:
return HttpResponseNotFound('<h1>Page not found</h1>')
else:
return HttpResponse('<h1>Page was found</h1>')

5.由于404错误的应用情景比较多,Django有一套默认处理机制。首先,当发生404异常时,会在根URLconf中查找处理404错误的handler404(并且只能在根URLconf中查找),如果找到了则按设置的错误视图模板显示404页面(还有处理500、403、400的handler)。

handler404 = 'mysite.views.my_custom_page_not_found_view'
handler500 = 'mysite.views.my_custom_error_view'

  如果没有设置handler404,会自动调用内置的django.views.defaults.page_not_found(),这个函数返回一个渲染“Lib\site-packages\django\contrib\admin\templates\admin\404.html”模板的HttpResponseNotFound对象。因此,通常情况下,可以不需要写404错误页面,在视图函数中抛出404异常时,框架会调用自带的404.html;如果需要自定义404页面,则可以在根URLconf中设置指向的自定义404页面,或者可以自编一个404.html文件放在模板树(template tree)的前面(一般是模板的根目录下),屏蔽默认404模板。如果settings里面的DEBUG设置为False,并且不创建404.html文件的话,会出现一个Http500错误,所以创建一个404.html模板文件是很有必要的。如果DEBUG设置为True,那么404view将不会被用到,因此404.html模板也不会被渲染,取而代之的将是浏览器上出现的traceback错误。在django的URLconf中无法匹配任何一个正则表达式时也会调用404页面。

Django视图函数的更多相关文章

  1. django视图函数及快捷方式

    视图函数,简称视图,本质上是一个简单的Python函数,它接受Web请求并且返回Web响应. 响应的内容可以是HTML网页.重定向.404错误,XML文档或图像等任何东西.但是,无论视图本身是个什么处 ...

  2. django视图函数解析(三)

    1 视图views概述 1 作用: 视图接受web请求并响应web请求 2 本质: 视图就是python中的处理函数 3 响应: 一般是一个网页的HTML内容.一个重定向.错误信息页面.json格式的 ...

  3. 【6】Django视图函数

    治大国若烹小鲜.以道莅天下 --老子<道德经> 本节内容 Django web项目的运行流程分析 视图处理函数的定义 多视图处理函数及接收参数 1. web项目运行流程分析 通常情况下,完 ...

  4. Django视图函数之三种响应模式

    视图函数响应处理: from django.shortcuts import render,HttpResponse,redirect (1)render 处理模板文件,可以渲染模板,第一个参数必须为 ...

  5. Django视图函数函数之视图装饰器

    FBV模式装饰器: 普通函数的装饰器(语法糖@) views.py from django.shortcuts import render def wrapper(f): def inner(*arg ...

  6. Django视图函数之FBV与CBV模式

    FBV模式: FBV(function base views) 就是在视图里使用函数处理请求. 一般直接用函数写的都属于是FBV模式. veiws.py from django.shortcuts i ...

  7. Django视图函数之request请求与response响应对象

    官方文档: https://docs.djangoproject.com/en/1.11/ref/request-response/ 视图中的request请求对象: 当请求页面时,Django创建一 ...

  8. Django视图函数:CBV与FBV (ps:补充装饰器)

    CBV 基于类的视图  FBV 基于函数的视图 CBV: 1 项目目录下: 2 urlpatterns = [ 3 path('login1/',views.Login.as_view()) #.as ...

  9. django视图函数中 应用装饰器

    from django.shortcuts import render, redirect, HttpResponse from .forms import LoginForm, Registrati ...

随机推荐

  1. PHP端验证代码、后端验证

    /** * 验证url是否存在 * @param string $url url路径 * @return boolean true:存在,false:不存在 */ public function va ...

  2. 手把手教你使用UICollectionView写公司的项目

    在很多app中都有这样通用的页面,一直没有机会使用UICollectionView,只是简单的看过他的使用方法.今天公司美工出图,使用了他,并且遇到了好多的坑.记录一下过程,不确定使用的方法是不是最优 ...

  3. WinForm控件小知识

    1.DataGridView控件显示自定义表 //造个数据表 DataTable dt = new DataTable(); dt.Columns.Add("DEcode", Sy ...

  4. C#学习笔记4:关键词大小写、复合格式化等

    1.取消选择的单选按钮值      RadioButton1.Checked=RadioButton2.Checked = false;//RadioButton1.Text = RadioButto ...

  5. 20150503-struts2入门-标签

    一.几个标签介绍 1.property标签 property标签用于输出指定值: <s:set name="name" value="'kk'" /> ...

  6. Windows8.1下PHP环境配置(PHP5.6、Apache2.4、MySql5.6)

    Step0 安装准备(均为64-bit版本) 下载php "Non Thread Safe"是IIS专用的,"Thread Safe"是Apache服务器用的. ...

  7. C#当中的泛型和java中的对比

    1.C#中的泛型 先写一个Demo: namespace generic {         public class Program         {                 static ...

  8. plupload+struts2实现文件上传下载

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8" ...

  9. JavaScript学习笔记(5)——JavaScript语法之数据类型

    JavaScript 拥有动态类型.这意味着相同的变量可用作不同的类型: var x // x 为 undefined var x = 6; // x 为数字 var x = "Bill&q ...

  10. thymeleaf的初次使用(带参请求以及调用带参js方法)

    之前对于前端框架接触较少,第一次接触thymeleaf,虽说看起来并不复杂但我还是花费了好一会儿才弄懂. 话不多少下面就简单说一下我在项目中的应用. 首先是java代码 controller层 将需要 ...