Django的view23事

demoapp为例。

view的一般步骤 1. 构造 Context,这是给模板传值的变量 2. 返回一个以模板构造生成的页面

render 还是用 render_to_response

render() 结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。

render() 与以一个强制使用RequestContext的context_instance 参数调用render_to_response() 相同。

所以,如果使用 render

from django.shortcuts import render

def view1(request):
    context = {'hello', 'Hello The World!'}
    return render(request, 'demo/hello.html', context)

如果使用 render_to_response

from django.shortcuts import render_to_response
from django.template import RequestContext

def view2(request):
    context = RequestContext()
    context.push({'hello', 'Hello The World!'})
    return render_to_response('demo/hello.html', context)

需要好好比较一下差异。

@装饰器

在一些view里我们经常要做一些重复性的工作,如判断是否已登录,否则跳转到登录页面,这些操作都必须在开始功能代码前进行,那我们就可以用 @装饰器 来减少代码。

from django.shortcuts import redirect
from django.shortcuts import resolve_url

def view1(request):
    reporter_is_login = request.session.get('_se_reporter_is_login', False)
    # 非登录状态的轩到登录页面
    if not reporter_is_login:
        resolved_login_url = resolve_url('demo:login')
        return redirect(resolved_login_url)
    # 以下功能代码
    ....

view2, view3的前端也都是这样的操作,那么我们用装饰器来实现

demo app目录下创建文件 decorator,py

from django.shortcuts import redirect
from django.shortcuts import resolve_url
import functools


def demo_login_required(reporter_login_url='demo:login'):
    # 报修未登录跳转到登录页面的装饰器
    def decorator(func):
        @functools.wraps(func)
        def wrapper(request, *args, **kwargs):
            reporter_is_login = request.session.get('_se_reporter_is_login', False)
            # 非登录状态的轩到登录页面
            if not reporter_is_login:
                resolved_login_url = resolve_url(reporter_login_url)
                return redirect(resolved_login_url)

            return func(request, *args, **kwargs)  # 对应wrapper的参数
        return wrapper
    return decorator

然后我们在需要做登记判断的 view 前加上装饰器,如修改 view1

from demo.decorator import demo_login_required

@demo_login_required
def view1(request):
    # 以下功能代码
    ....

过滤器

发布时间:
2016-10-12 21:35
分类:
标签: