【问题标题】:Coaxing Flask/werkzeug to render a (flask-admin) page from the python shell哄骗 Flask/werkzeug 从 python shell 呈现(flask-admin)页面
【发布时间】:2014-05-01 01:39:47
【问题描述】:

使用我在flask-admin/pymongo/flask 戳的 python shell 并试图弄清楚我是否可以诱使它转储它会为给定页面生成的 html。

我粘贴到python shell的代码如下:

from flask import Flask
from flask.ext.admin import Admin
from flask.ext.admin.contrib.pymongo import ModelView
from wtforms import form, fields
import pymongo

class UserForm(form.Form):
    dispname = fields.TextField('Name')
    email = fields.TextField('Email')

class UserView(ModelView):
    column_list = ('dispname', 'email', 'username', 'userextra')
    form = UserForm

client = pymongo.MongoClient()
db = client['cloud']
app = Flask('putting_a_name_here')
admin = Admin(app)
admin.add_view(UserView(db['userpgs']))

#app.run(host='0.0.0.0') # If this is uncommented connecting to
                         # http://localhost:5000/admin/userpgsview
                         # properly renders the contents of the mongo
                         # collection 'userpgs' in db 'cloud'

(我意识到通过在示例中保留flask-adminpymongo/flask.ext.admin.contrib.pymongo 使这变得相当复杂,但flask-admin rendering/html 是我真正想要理解的。 )

我无法找到有关如何调用/使用烧瓶渲染/html 的直接文档,但是通过向库添加一些调试,我已经能够看到上面的代码导致烧瓶中的蓝图/规则代码在我的app 中运行并填充一个名为view_functions 的列表,其中包含函数回调(有希望的名称,如userpgsview.ajax_loopupuserpgsview.index_view 等)。

index_view,(来自其他调试)似乎绑定到 url admin/userpgsviw/ 是我最想了解的,所以我开始尝试:

>>> app.view_functions.get(u'userpgsview.index_view')()

导致异常RuntimeError: working outside of application context的回溯

在烧瓶文档中挖掘有关使用python shell 的信息,我找到了有关设置上下文的信息,所以我做了以下操作

ctx=app.test_request_context()
ctx.push()
app.preprocess_request()

又试了一次,结果:

>>> app.view_functions.get(u'userpgsview.index_view')()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/flask_admin/base.py", line 62, in inner
    return f(self, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/flask_admin/base.py", line 62, in inner
    return f(self, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/flask_admin/base.py", line 62, in inner
    return f(self, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/flask_admin/model/base.py", line 1191, in index_view
    filters),
  File "/usr/local/lib/python2.7/dist-packages/flask_admin/model/base.py", line 1062, in _get_url
    return url_for(view, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/flask/helpers.py", line 312, in url_for
    return appctx.app.handle_url_build_error(error, endpoint, values)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1641, in handle_url_build_error
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/dist-packages/flask/helpers.py", line 305, in url_for
    force_external=external)
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/routing.py", line 1620, in build
    raise BuildError(endpoint, values, method)
werkzeug.routing.BuildError: ('index_view', {}, None)

我还没有找到任何关于如何初始化事物的线索,所以werkzeug.routing 很高兴。

弗兰克,如果我从完全错误的方法中得出这个结论,我不会感到惊讶,但我没有任何运气找到其他文档,我应该如何手动运行烧瓶,如果我的目标是诱使它生成它将在http://localhost:5000/admin/userpgsview 的html-get 上创建的html。

非常欢迎任何想法。

【问题讨论】:

    标签: flask werkzeug flask-admin python


    【解决方案1】:

    您应该可以使用Flask testing client 来模拟请求:

    # Instead of test_request_context
    client = app.test_client()
    response = client.get("/admin/userpgsview")
    # work with response here
    

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 2020-09-17
      • 2017-11-18
      • 1970-01-01
      • 2022-10-04
      • 2012-08-02
      相关资源
      最近更新 更多