标签: werkzeug

在Flask路线中捕获任意路径

我有一个简单的Flask路由,我想捕获文件的路径.如果我<path>在规则中使用,它适用/get_dir/one但不适用/get_dir/one/two.如何捕获任意路径,以便path='/one/two/etc传递给视图函数?

@app.route('/get_dir/<path>')
def get_dir(path):
    return path
Run Code Online (Sandbox Code Playgroud)

python werkzeug flask

24
推荐指数
1
解决办法
2万
查看次数

Flask/Werkzeug,登录后如何返回上一页

我正在使用基于Werkzeug的Flask微框架,它使用Python.

在每个受限制的页面之前有一个装饰器,以确保用户登录,如果他们没有登录,当前将它们返回到登录页面,如下所示:

# Decorator
def logged_in(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        try:
            if not session['logged_in']:
                flash('Please log in first...', 'error')
                return redirect(url_for('login'))
            else:
                return f(*args, **kwargs)
        except KeyError:
            flash('Please log in first...', 'error')
            return redirect(url_for('login'))
    return decorated_function


# Login function
@app.route('/', methods=['GET', 'POST'])
def login():
    """Login page."""
    if request.method=='POST':
    ### Checks database, etc. ###
    return render_template('login.jinja2')


# Example 'restricted' page
@app.route('/download_file')
@logged_in
def download_file():
    """Function used to send files for download to user."""
    fileid = request.args.get('id', 0)
    ### ... ###
Run Code Online (Sandbox Code Playgroud)

登录后,需要将用户返回到将其带到登录页面的页面.它还需要保留诸如传递的变量之类的东西(即整个链接基本上都是www.example.com/download_file?id=3) …

python login werkzeug flask

23
推荐指数
2
解决办法
1万
查看次数

在Jinja2/Werkzeug中渲染python dict

我正在玩一个url shortener(基于Werkzeug的Shortly演示应用程序).

我有这样的字典 -

    ('1', {'target': 'http://10.58.48.103:5000/', 'clicks': '1'})
    ('3', {'target': 'http://slash.org', 'clicks': '4'})
    ('2', {'target': 'http://10.58.48.58:5000/', 'clicks': '1'})
    ('5', {'target': 'http://de.com/a', 'clicks': '0'})
Run Code Online (Sandbox Code Playgroud)

在url_list中返回并由render_template使用

def on_list_urls(self, request):
    url_list = self.get_urls()
    return self.render_template('list_urls.html',
        url_list = url_list
    )
Run Code Online (Sandbox Code Playgroud)

模板list_urls非常简单 -

    {% extends "layout.html" %}
    {% block title %}List URLs{% endblock %}
    {% block body %}
      <h2>List URLs</h2>
      <ul id="items">
      {% for item in url_list %}
        <li>{{ item }}</li>
      {% endfor %}
      </ul>

    {% endblock %}
Run Code Online (Sandbox Code Playgroud)

事情是,我似乎无法访问dict中的项目.

这条线

<li>{{ item }}</li>
Run Code Online (Sandbox Code Playgroud)

是我关注的焦点.如上所述,我得到了dict中的键列表. …

python werkzeug jinja2

23
推荐指数
1
解决办法
7万
查看次数

检查Flask请求上下文是否可用

我想在Flask请求期间记录时记录上下文变量(request,session)中的一些数据,但是如果没有则使用默认行为.

我正在使用一个try ... exceptlogging.formatter.有没有更好的方法来检查请求上下文?

try:
    record.user = session['user_name']
    record.very_important_data = request.super_secret
except Exception:
    record.user = None
Run Code Online (Sandbox Code Playgroud)

python logging werkzeug flask

23
推荐指数
1
解决办法
5909
查看次数

自定义错误消息json对象与flask-restful

使用方法很容易使用flask-restful传播错误消息到客户端abort(),例如

abort(500, message="Fatal error: Pizza the Hutt was found dead earlier today
in the back seat of his stretched limo. Evidently, the notorious gangster
became locked in his car and ate himself to death.")
Run Code Online (Sandbox Code Playgroud)

这将生成以下json输出

{
  "message": "Fatal error: Pizza the Hutt was found dead earlier today
       in the back seat of his stretched limo. Evidently, the notorious gangster
       became locked in his car and ate himself to death.", 
  "status": 500
}
Run Code Online (Sandbox Code Playgroud)

有没有办法用其他成员自定义json输出?例如:

{
  "sub_code": 42,
  "action": "redirect:#/Outer/Space" …
Run Code Online (Sandbox Code Playgroud)

werkzeug flask flask-restful

22
推荐指数
4
解决办法
1万
查看次数

如何将集成测试(而不是单元测试)应用于Flask RESTful API

[根据/sf/answers/3245896181/,标题应参考集成测试而不是单元测试]

假设我想测试以下Flask API(从这里开始):

import flask
import flask_restful

app = flask.Flask(__name__)
api = flask_restful.Api(app)

class HelloWorld(flask_restful.Resource):
    def get(self):
        return {'hello': 'world'}

api.add_resource(HelloWorld, '/')

if __name__ == "__main__":
    app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

将此保存flaskapi.py并运行后,在同一目录中运行脚本test_flaskapi.py:

import unittest
import flaskapi
import requests

class TestFlaskApiUsingRequests(unittest.TestCase):
    def test_hello_world(self):
        response = requests.get('http://localhost:5000')
        self.assertEqual(response.json(), {'hello': 'world'})


class TestFlaskApi(unittest.TestCase):
    def setUp(self):
        self.app = flaskapi.app.test_client()

    def test_hello_world(self):
        response = self.app.get('/')

if __name__ == "__main__":
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

两个测试都通过了,但对于第二个测试(在TestFlaskApi类中定义),我还没有弄清楚如何断言JSON响应是否符合预期(即{'hello': 'world'}).这是因为它是一个实例flask.wrappers.Response(可能基本上是一个Werkzeug响应对象(参见http://werkzeug.pocoo.org/docs/0.11/wrappers/)),但我找不到相应的Response …

python integration-testing werkzeug flask flask-restful

22
推荐指数
3
解决办法
3万
查看次数

使用Flask处理大型文件上传

使用Flask处理超大文件上传(1 GB +)的最佳方法是什么?

我的应用程序本质上需要多个文件为它们分配一个唯一的文件号,然后根据用户选择的位置将其保存在服务器上.

我们如何将文件上传作为后台任务运行,这样用户就不会让浏览器旋转1小时,而是可以立即进入下一页?

  • Flask开发服务器能够获取大量文件(50gb需要1.5小时,上传速度很快但将文件写入空白文件非常慢)
  • 如果我用Twisted包装应用程序,应用程序会在大文件上崩溃
  • 我已经尝试过将Celery与Redis一起使用,但这似乎不是发布上传的选项
  • 我在Windows上,网络服务器的选项较少

python file-upload twisted werkzeug flask

19
推荐指数
2
解决办法
8232
查看次数

使用Flask中的变量和url_for构建错误

在类似问题的互联网上找到一两个人,但没有看到任何地方发布的解决方案.我从下面的代码/模板中得到了构建错误,但无法确定问题的位置或原因.似乎模板没有识别该功能,但不知道为什么会发生这种情况.任何帮助将不胜感激 - 现在已经敲了两下我的键盘.

功能:

@app.route('/viewproj/<proj>', methods=['GET','POST'])
def viewproj(proj):
Run Code Online (Sandbox Code Playgroud)

...

模板摘录:

{% for project in projects %}
  <li>
<a href="{{ url_for('viewproj', proj=project.project_name) }}">
{{project.project_name}}</a></li>
{% else %}
No projects
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

错误日志:https: //gist.github.com/1684250

编辑:还想包括它在构建URL时没有识别变量"proj",所以它只是将值附加为参数.这是一个例子:// myproject/viewproj?projname = what + up

最后几行:

[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128]   File "/srv/www/myproject.com/myproject/templates/layout.html", line 103, in top-level template code, referer: xx://myproject.com/
[Wed Jan 25 09:47:34 2012] [error] [client 199.58.143.128]     {% block body %}{% endblock %}, referer: xx://myproject.com/
[Wed Jan 25 09:47:34 …
Run Code Online (Sandbox Code Playgroud)

python build-error werkzeug url-for flask

18
推荐指数
3
解决办法
5万
查看次数

当我在gunicorn上运行Flask应用程序时设置app.wsgi_app = ProxyFix(app.wsgi_app)会发生什么?

我使用Flask构建了一个基本的Web应用程序,并且能够使用其本机http服务器从虚拟机运行它.我很快意识到,通过这个设置,请求被阻止(我无法对资源进行并发请求;任何新请求都要等到早期请求完成),并决定尝试使用gunicorn运行应用程序来解决此问题.我按照文档,特别是使用此行运行:

gunicorn -w 4 -b 127.0.0.1:4000 myproject:app 
Run Code Online (Sandbox Code Playgroud)

但是,它无法启动这样做,并抱怨没有WSGI应用程序.在互联网上闲聊,我发现有很多人发布了以下示例:

from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)
Run Code Online (Sandbox Code Playgroud)

我补充说,它解决了我的问题.我很困惑,因为这显然是为了解决在HTTP代理后面服务的问题,但是增加的gunicorn会强加一个HTTP代理吗?或者我总是落后于代理,而Flask的内置服务器并不重要?

此外,Werkzeug关于Fixers的文档警告"出于安全原因,不要在非代理设置中使用此中间件." 考虑到修复显然是必要的,我可以假设我正在进行代理设置吗?

python wsgi werkzeug flask gunicorn

18
推荐指数
2
解决办法
7590
查看次数

X-Forwarded-Proto和Flask

我有这个问题和答案中描述的完全相同的问题.这个问题的答案是一个很好的解决方法,但我不明白根本问题.在负载均衡器处终止SSL并在负载均衡器和Web/app服务器之间使用HTTP非常常见.什么片段不尊重X-Forwarded-Proto?是werkzeug吗?烧瓶?uwsgi?

在我的情况下,我正在使用AWS ELB(设置X-Forwarded-Proto)=> Nginx(它沿着X-Forwarded-Proto转发到uwsgi).但是在python应用程序中,我必须按照上面引用的问题中描述的Flask Request子类.

由于这是一种常见的部署方案,似乎应该有更好的解决方案.我错过了什么?

python nginx werkzeug flask uwsgi

18
推荐指数
1
解决办法
6083
查看次数