shortcuts.py 文件源码

python
阅读 27 收藏 0 点赞 0 评论 0

项目:jiango 作者: yefei 项目源码 文件源码
def renderer(prefix=None, default_extends_layout=True,
             template_ext='html', content_type=settings.DEFAULT_CONTENT_TYPE):
    def render(func=None, extends_layout=default_extends_layout,
               login=True, logout=False, perm=None):
        def do_wrapper(func):
            @wraps(func)
            def wrapper(request, *args, **kwargs):
                response = HttpResponse(content_type=content_type)
                content = ''

                if logout:
                    if get_request_user(request):
                        return logout_redirect(request)
                elif login:
                    if not get_request_user(request):
                        return login_redirect(request)

                try:
                    if perm:
                        has_perm(request, perm)
                    result = func(request, response, *args, **kwargs)
                except HttpReload as e:
                    return e.response(request, response)
                except (Alert, ObjectDoesNotExist) as e:
                    result = {}
                    if isinstance(e, Alert):
                        result = {'message': e.message, 'tag': e.tag, 'buttons': e.buttons}
                        if e.back and 'HTTP_REFERER' in request.META:
                            result['buttons'][u'??'] = request.META['HTTP_REFERER']
                    elif isinstance(e, ObjectDoesNotExist):
                        result = {'message': u'??????????????????\n%s' % e, 'tag':'error'}
                    content = render_to_string(request, result, '/admin/alert', prefix, template_ext)
                else:
                    if isinstance(result, HttpResponse):
                        return result
                    content = render_to_string(request, result, func.__name__.rstrip('_'), prefix, template_ext)
                    if not extends_layout:
                        response.content = content
                        return response

                from .loader import get_navigation
                user = get_request_user(request)
                base_dictionary = {'content': content,
                                   'navigation': user and get_navigation(request),
                                   'user': user}
                response.content = render_to_string(request, base_dictionary, 'admin/layout')
                return response
            return wrapper

        # @render() ???
        if func is None:
            return do_wrapper

        # @render ????
        return do_wrapper(func)
    return render
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号