фляга url_for TypeError

У меня возникает ошибка при попытке использовать метод url_for в Flask. Я не уверен, в чем причина этого, потому что я следую только быстрому запуску Flask. Я специалист по Java с небольшим опытом работы с Python и хочу изучить Flask.

Вот след:

Traceback (most recent call last):
  File "hello.py", line 36, in <module>
    print url_for(login)
  File "/home/cobi/Dev/env/flask/latest/flask/helpers.py", line 259, in url_for
    if endpoint[:1] == '.':
TypeError: 'function' object has no attribute '__getitem__

Мой код такой:

from flask import Flask, url_for
app = Flask(__name__)
app.debug = True

@app.route('/login/<username>')
def login(): pass

with app.test_request_context():
  print url_for(login)

Я пробовал как стабильную, так и разрабатываемую версию Flask, и ошибка все еще возникает. Любая помощь будет высоко ценится! Спасибо и извините, если мой английский не очень хорош.


person cobicobi    schedule 14.10.2012    source источник


Ответы (1)


В документах сказано, что url_for принимает строку, а не функцию. Вам также необходимо указать имя пользователя, поскольку оно требуется для созданного вами маршрута.

Сделайте это вместо этого:

with app.test_request_context():
    print url_for('login', username='testuser')

Вы получаете эту ошибку, потому что строки имеют метод __getitem__, а функции — нет.

>>> def myfunc():
...     pass
... 
>>> myfunc.__getitem__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute '__getitem__'
>>> 'myfunc'.__getitem__
<method-wrapper '__getitem__' of str object at 0x10049fde0>
>>> 
person Nathan Villaescusa    schedule 14.10.2012
comment
Мой плохой, ты прав. Но теперь появилась другая ошибка. print url_for('login') File "/home/cobi/Dev/env/flask/latest/flask/helpers.py", line 296, in url_for return appctx.app.handle_url_build_error(error, endpoint, values) File "/home/cobi/Dev/env/flask/latest/flask/helpers.py", line 289, in url_for force_external=external) File "/home/cobi/Dev/env/flask/latest/venv/local/lib/python2.7/site-packages/Werkzeug-0.8.3-py2.7.egg/werkzeug/routing.py", line 1607, in build raise BuildError(endpoint, values, method) werkzeug.routing.BuildError: ('login', {}, None) - person cobicobi; 14.10.2012
comment
Ваша проблема в том, что он ожидает, что функция входа в систему имеет указанное имя пользователя. Вместо этого используйте url_for('login', username='cobicobi'). - person Nathan Villaescusa; 14.10.2012
comment
Ах, я думаю, что я получил это сейчас. Ты прав. url_for должен иметь хотя бы параметр, определенный в конечной точке. Если я не определю параметр в конечной точке, то url_for будет работать либо с параметром, либо без него. Но если я определю в нем параметр, мне также придется указать этот параметр в вызове url_for. - person cobicobi; 14.10.2012