烧瓶装饰器不能很好地协同工作

亚历杭德罗·VK

我正在尝试在测试Flask应用程序中使用蓝图,但遇到了一个奇怪的问题。这是我的代码的相关部分:

from functools import wraps
from flask import flash, redirect, render_template, \
request, session, url_for, Blueprint
from sqlalchemy.exc import IntegrityError
from datetime import datetime
from time import localtime, strftime

from .forms import AddAppointmentForm
from project import db
from project.models import Appointment

appointments_blueprint = Blueprint('appointments', __name__)

def login_required(test):
    @wraps(test)
    def wrap(*args, **kwargs):
        if 'logged_in' in session:
            return test(*args, **kwargs)
        else:
            flash('You need to login first.')
            return redirect(url_for('users.login'))
        return wrap

@appointments_blueprint.route('/appointments/')
@login_required
def appointments():
    # Get current date
    current_datetime = strftime("%Y-%m-%d %H:%M:%S", localtime())
    future_appointments = db.session.query(Appointment)\
        .filter(Appointment.due_date >= current_datetime)\
        .order_by(Appointment.due_date.asc())
    past_appointments = db.session.query(Appointment)\
        .filter(Appointment.due_date < current_datetime)\
        .order_by(Appointment.due_date.asc())
    return render_template('appointments.html',
        form = AddAppointmentForm(request.form),
        future_appointments=future_appointments,
        past_appointments=past_appointments)

现在,当我运行该应用程序时,出现以下错误:

  File "/home/mosquito/git/flask-scheduler/project/appointments/views.py", line 72, in <module>
    @login_required
  File "/home/mosquito/python_envs/flask-scheduler/local/lib/python2.7/site-packages/flask/blueprints.py", line 160, in decorator
    endpoint = options.pop("endpoint", f.__name__)
AttributeError: 'NoneType' object has no attribute '__name__'

查看blueprints.py,我看到以下内容:

def route(self, rule, **options):
    """Like :meth:`Flask.route` but for a blueprint.  The endpoint for the
    :func:`url_for` function is prefixed with the name of the blueprint.
    """
    def decorator(f):
        endpoint = options.pop("endpoint", f.__name__)
        self.add_url_rule(rule, endpoint, f, **options)
        return f
    return decorator

这失败,因为'f'为None。现在更有趣的是,如果我删除

@login_required

装饰器,当它到达那个点时,f是一个函数,所以没关系。

另一方面,如果我删除

@appointments_blueprint.route()

装饰器,它也可以工作。因此,看起来这两个装饰器的组合导致f为None ....任何想法,这是怎么回事?

马丁·彼得斯(Martijn Pieters)

您需要取消缩进return

def login_required(test):
    @wraps(test)
    def wrap(*args, **kwargs):
        if 'logged_in' in session:
            return test(*args, **kwargs)
        else:
            flash('You need to login first.')
            return redirect(url_for('users.login'))
    return wrap

您使其成为wrap函数本身的一部分,因此外部装饰器函数未返回任何内容。

删除@appointments_blueprint.route()简单路线不会注册路线,因此您永远不会发现自己设置appointmentsNone

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

过渡和不透明不能很好地协同工作

来自分类Dev

jsPlumb makeSource()和jQuery sortable()不能很好地协同工作

来自分类Dev

jsPlumb makeSource()和jQuery sortable()不能很好地协同工作

来自分类Dev

过渡和不透明不能很好地协同工作

来自分类Dev

SELinux + MergerFS(保险丝)不能很好地协同工作

来自分类Dev

烧瓶装饰器设置端点类别

来自分类Dev

如何使这两个功能很好地协同工作?

来自分类Dev

IIS 7.5和使匿名身份验证/表单身份验证可以很好地协同工作

来自分类Dev

如何模拟单元测试的烧瓶装饰器@login_required?

来自分类Dev

JFuzzyLogic在Eclipse IDE中提供错误,同时代码可以与另一个IDE很好地协同工作

来自分类Dev

我如何协同工作?

来自分类Dev

Mongo maxTimeMS不能很好地工作。

来自分类Dev

jQuery重定向不能很好地工作

来自分类Dev

HorizontalScrollView android不能很好地工作

来自分类Dev

ListView.model不能很好地工作

来自分类Dev

实体框架如何与数据推送更新有机地协同工作

来自分类Dev

.htaccess 重写不能与来自虚拟主机的别名协同工作

来自分类Dev

如何使我的方法协同工作

来自分类Dev

如何使SSRS和Chrome协同工作?

来自分类Dev

使Spark,Python和MongoDB协同工作

来自分类Dev

使Viewbox和ScrollViewer协同工作

来自分类Dev

KeyEvent:使多个输入协同工作

来自分类Dev

Docker容器:它们如何协同工作?

来自分类Dev

让Android + Gradle + Jenkins + Spoon协同工作

来自分类Dev

使Typescript节点模块协同工作

来自分类Dev

使Viewbox和ScrollViewer协同工作

来自分类Dev

函数和列表如何协同工作?

来自分类Dev

Angular 4 和 Umbraco 协同工作

来自分类Dev

如何让这些查询协同工作?

Related 相关文章

热门标签

归档