django-原理-shortcut functions

写views

参考:
https://docs.djangoproject.com/en/1.10/topics/http/shortcuts/#render-to-response

view是python函数,返回response
response可以包含HTML、重定向、404、xml、图片...
一个简单的view

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)

映射url到views
URL dispatcher

返回erros
关于request和response的子类,参考:
https://docs.djangoproject.com/en/1.10/ref/request-response/#ref-httpresponse-subclasses

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>')

也可以在HttpResponse构造函数中添加返回值

from django.http import HttpResponse

def my_view(request):
    # ...

    # Return a "created" (201) response code.
    return HttpResponse(status=201)

因为404比较普遍,所以提供了专门的类
Http404
如果返回类似HttpResponseNotFound的页面,可以定义html返回

return HttpResponseNotFound('<h1>Page not found</h1>')

django会捕获404异常,并且返回标准的404页

from django.http import Http404
from django.shortcuts import render
from polls.models import Poll

def detail(request, poll_id):
    try:
        p = Poll.objects.get(pk=poll_id)
    except Poll.DoesNotExist:
        raise Http404("Poll does not exist")
    return render(request, 'polls/detail.html', {'poll': p})

可以创建一个404.html模板,并且把它放置在template tree的最顶层;
如果在debug模式,会返回标准的debug404

定制错误views
可以用handler404覆盖page_not_found()

handler404 = 'mysite.views.my_custom_page_not_found_view'

server_error()被handler500覆盖

handler500 = 'mysite.views.my_custom_error_view'

permission_denied()被handler403覆盖

handler403 = 'mysite.views.my_custom_permission_denied_view'

bad_request()被handler400覆盖

handler400 = 'mysite.views.my_custom_bad_request_view'

CSRF错误可以用CSRF_FAILURE_VIEW设置;

shortcut函数

render()

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

渲染模板,返回HttpResponse对象
必要参数:request,template_name
额外参数

context			默认是个空词典,如果能被调用,会在模板加载前调用
content_type	用来返回document的MIME类型,默认是DEFAULT_CONTENT_TYPE设置
status			默认200
using			模板引擎

例子:

from django.shortcuts import render

def my_view(request):
    # View code here...
    return render(request, 'myapp/index.html', {
        'foo': 'bar',
    }, content_type='application/xhtml+xml')
from django.http import HttpResponse
from django.template import loader

def my_view(request):
    # View code here...
    t = loader.get_template('myapp/index.html')
    c = {'foo': 'bar'}
    return HttpResponse(t.render(c, request), content_type='application/xhtml+xml')

render_to_response()
弃用

redirect()

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

返回HttpResponseRedirect
这样参数会

  • 调用get_absolute_url()
  • reverse() 重新解析name
  • URL重定向
    permanent=True返回永重构定向, permanent=false返回临时重定向;

有多重方法可以使用redirect()
get_absolute_url() 方法会解析到重定向的url

from django.shortcuts import redirect

def my_view(request):
    ...
    object = MyModel.objects.get(...)
    return redirect(object)

可以通过reverse解析

def my_view(request):
    ...
    return redirect('some-view-name', foo='bar')

解析到的url标准url解析

def my_view(request):
    ...
    return redirect('/some/url/')

也可用在全url

def my_view(request):
    ...
    return redirect('https://example.com/')

get_object_or_404()
get_object_or_404(klass, *args, **kwargs)
调用在模型管理器上调用get()会跑出Http404 ,而不是DoesNotExist异常

klass		Module类、Manager或者QuerySet
**kwargs	查找参数
from django.shortcuts import get_object_or_404

def my_view(request):
    my_object = get_object_or_404(MyModel, pk=1)

例子相当于

from django.http import Http404

def my_view(request):
    try:
        my_object = MyModel.objects.get(pk=1)
    except MyModel.DoesNotExist:
        raise Http404("No MyModel matches the given query.")

传递QuerySet例子:

queryset = Book.objects.filter(title__startswith='M')
get_object_or_404(queryset, pk=1)

这个例子相当于

get_object_or_404(Book, title__startswith='M', pk=1)

使用 related managers

author = Author.objects.get(name='Roald Dahl')
get_object_or_404(author.book_set, title='Matilda')

get_list_or_404()
get_list_or_404(klass, *args, **kwargs)
参数

klass		 Model, Manager or QuerySet获取list用
**kwargs	 get() and filter()
from django.shortcuts import get_list_or_404

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

这个例子相当于

from django.http import Http404

def my_view(request):
    my_objects = list(MyModel.objects.filter(published=True))
    if not my_objects:
        raise Http404("No MyModel matches the given query.")
posted @ 2017-01-20 11:12  zhangshihai1232  阅读(149)  评论(0)    收藏  举报