假设我有以下结构:
/root/user/login
Run Code Online (Sandbox Code Playgroud)
我在蓝图中登录:
app.register_blueprint(login_blueprint,url_prefix=prefix('/user'))
Run Code Online (Sandbox Code Playgroud)
我可以重定向到".index":
@login_blueprint.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
#### this redirects me to '/root/user/'
redirect_to_index= redirect(url_for('.index'))
response = current_app.make_response(redirect_to_index)
# do the log in
return response
redirect_to_index=redirect(url_for('.index'))
response = current_app.make_response(redirect_to_index)
Run Code Online (Sandbox Code Playgroud)
重定向带我到/root/user:
redirect(url_for('.index'))
Run Code Online (Sandbox Code Playgroud)
但是如何到达/root(相对于当前的url(..)是多少?
我希望获得HTTP版本,例如'HTTP/1.1','HTTP/1.0'.我检查了所有var in request,但一无所获.
['__class__', '__delattr__', '__dict__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_get_file_stream', '_get_stream_for_parsing', '_is_old_module', '_load_form_data', '_parse_content_type', 'accept_charsets', 'accept_encodings', 'accept_languages', 'accept_mimetypes', 'access_route', 'application', 'args', 'authorization', 'base_url', 'blueprint', 'cache_control', 'charset', 'close', 'content_encoding', 'content_length', 'content_md5', 'content_type', 'cookies', 'data', 'date', 'dict_storage_class', 'disable_data_descriptor', 'encoding_errors', 'endpoint', 'environ', 'files', 'form', 'form_data_parser_class', 'from_values', 'full_path', 'get_data', 'get_json', 'headers', 'host', 'host_url', 'if_match', 'if_modified_since', 'if_none_match', 'if_range', 'if_unmodified_since', 'input_stream', 'is_multiprocess', 'is_multithread', 'is_run_once', 'is_secure', 'is_xhr', 'json', 'list_storage_class', 'make_form_data_parser', 'max_content_length', 'max_form_memory_size', 'max_forwards', …Run Code Online (Sandbox Code Playgroud) 我需要在浏览器中同时测试两个Flask应用程序.按标准,Flask在localhost:5000中运行应用程序.因此,一个好的选择是改变其中一个应用程序的地址.那可能吗?如果是这样,怎么办?
我觉得我把它变成了龙卷风,而且它的状态很差。目标是将错误消息放入模板中。此错误消息只需要在一个处理程序中(负责同一页面)。
模板行:
{% if errormsg is not None %}
<div class="alert-warning">{{ errormsg }}</div>
{% end %}
Run Code Online (Sandbox Code Playgroud)
相关的处理程序部分:
if auth:
self.set_current_user(username)
self.redirect(self.get_argument("next",u"/"))
else:
self.errormsg = "Login Failed"
self.render("login.html", errormsg=self.errormsg)
Run Code Online (Sandbox Code Playgroud)
此时,当 errormsg 未设置为某些内容时,我在页面上收到全局命名空间错误消息。
NameError: global name 'errormsg' is not defined
Run Code Online (Sandbox Code Playgroud)
我发现的解决方法是在我的 BaseHandler 中使用全局渲染函数(我不喜欢这一点):
def render(self, template, **kwargs):
if hasattr(self, 'errormsg'):
kwargs['errormsg'] = self.errormsg
else:
kwargs['errormsg'] = None
super(BaseHandler, self).render(template, **kwargs)
Run Code Online (Sandbox Code Playgroud)
这基本上现在将 errormsg 添加到每个渲染中。有没有正确的方法来做到这一点,不会与全局渲染功能混淆?
谢谢!
编辑:
因为我实际上试图做的是将不同/多个非标准 kwargs 参数传递给继承的处理程序,所以我实际上真的认为我正在寻找一种更好的方法来测试,在这种情况下,是在模板上下文中的 errormsg。
{% if 'errormsg' in globals() %}
Run Code Online (Sandbox Code Playgroud)
这仍然感觉很糟糕,因为这个问题是第一次在使用龙卷风时实际出现全局变量。
我确实喜欢扩展渲染来为所有继承的处理程序设置 kwargs 默认值(它实际上是做什么的)。我认为这也可能类似于 self.current_user 的工作方式。
因为 'code' 是下面 MethodView 类 C 的 get 方法的参数,所以当我调用 url_for('c', code='O7A') 时,我希望得到的 url 是:/c/O7A
我看到的不是预期值,而是:/c/?code=O7A
from flask import Flask, url_for
from flask.views import MethodView
app = Flask(__name__)
class B(MethodView):
def get(self):
return 'ok'
def post(self):
print url_for('c', code='O7A')
return 'ok'
app.add_url_rule('/b',
view_func=B.as_view('b'),
methods=['GET', 'POST'])
class C(MethodView):
def get(self, code):
return 'ok'
def post(self):
return 'ok'
app.add_url_rule('/c/<code>',
view_func=C.as_view('c'),
methods=['GET'])
app.add_url_rule('/c/',
view_func=C.as_view('c'),
methods=['POST'])
print app.url_map
if __name__ == "__main__":
app.run()
Run Code Online (Sandbox Code Playgroud) 我有一个带有多个蓝图模块的应用程序.
我想从一个不同的蓝图路线中调用通常会返回视图或渲染模板的方法(路径).
怎么能正确完成?
谢谢.
当我想在try块中使用烧瓶中止时,我最终会进入我的异常块
@app.route('/newsletters/<int:newsletter_id>', methods=['GET'])
def route_get_newsletter(newsletter_id):
if request.method == 'GET':
try:
newsletter = get_newsletter(newsletter_id)
if not newsletter:
abort(404)
except Exception, ex:
logging.exception("Something awful happened!")
abort(500)
else:
return jsonify(newsletter=newsletter)
Run Code Online (Sandbox Code Playgroud)
给出输出:
ERROR:root:Something awful happened!
Traceback (most recent call last):
File "natuurpuntapi.py", line 210, in route_get_newsletter
abort(404)
File "/usr/lib/python2.7/dist-packages/werkzeug/exceptions.py", line 525, in __call__
raise self.mapping[code](*args, **kwargs)
NotFound: 404: Not Found
Run Code Online (Sandbox Code Playgroud)
和werkzeug NotFound被调用,我得到了500响应
当我把中止(404)放在try:block之外时,它可以工作,我得到了404响应
我发现烧瓶abort()使用werkzeug abort(),这是一个名为Aborter()的类,当它被调用时,它会引发"raise self.mapping [code](*args,**kwargs)"
这是否意味着我不能在我自己的try块中调用abort,因为它会引发异常并最终出现在我的异常中?
当我使用此功能上传文件时:
@app.route('/add_item', methods=['GET', 'POST'])
@login_required
def new_item():
error = None
form = AddItemForm(request.form)
if request.method == 'POST':
file = request.files['file']
if file and allowed_file(file.filename) and form.name.data != "" and form.description.data != "":
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOADED_ITEMS_DEST'], filename))
new_item = Item(
filename,
form.name.data,
form.description.data,
form.price.data,
form.age.data,
form.particles.data,
form.category.data,
'1',
)
db.session.add(new_item)
db.session.commit()
return redirect(url_for('admin_items'))
else:
return render_template('admin_items.html', form=form, error=error)
if request.method == 'GET':
return redirect(url_for('admin_items'))
Run Code Online (Sandbox Code Playgroud)
如何使用删除项目的功能删除此上传的文件?问题是我当前具有的功能仅删除项目的内容(描述,价格等),但是上传至文件夹的实际文件当然不会被删除!这就产生了问题!
这是我的删除功能:
# Delete Items:
@app.route('/delete_item/<int:item_id>/', methods=['GET', 'POST'])
@login_required
def delete_item(item_id):
new_id = item_id
os.remove(os.path.join(app.config['UPLOADED_ITEMS_DEST'], filename)) …Run Code Online (Sandbox Code Playgroud) 我用它来设置我的日志,但没有用。
tornado.options.options['log_file_prefix'].set('/opt/logs/my_app.log')
tornado.options.parse_command_line()
Run Code Online (Sandbox Code Playgroud)
得到这个错误
tornado.options.options['log_file_prefix'].set('/logs/my_app.log')
TypeError: 'OptionParser' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)
我希望将日志打印在终端和日志文件上,并且我通过 xml 配置文件而不是直接通过命令行启动我的应用程序,我该怎么做?
我有一个包含22个.sgm格式文件的文件夹.我想读取所有文件.我将传递的命令行参数的输入将如下所示
/usr/local/pub/tmh/Reuters/*.sgm
所以这应该读取文件夹中的所有sgm格式文件.
我编写的使用python 3.4.2的代码是
allfiles=(glob.glob(sys.argv[1]))
print(allfiles)
Run Code Online (Sandbox Code Playgroud)
现在我得到的是1个文件 /usr/local/pub/tmh/Reuters/reut2-000.sgm.其余的没有被glob选中.此外,我试图打印应打印此参数,/usr/local/pub/tmh/Reuters/*.sgm但它打印/usr/local/pub/tmh/Reuters/reut2-000.sgm(这是文件夹中的第一个文件)