在另一个系统上运行 Flask 项目后,我收到以下消息。该应用程序一直运行没有问题:
Error: While importing 'app', an ImportError was raised:
Traceback (most recent call last):
File "c:\users\User\appdata\local\programs\python\python39\lib\site-packages\flask\cli.py", line 214, in locate_app
__import__(module_name)
File "C:\Users\User\Desktop\Projekt\app\__init__.py", line 3, in <module>
from flask_restx import Namespace, Api
File "c:\users\User\appdata\local\programs\python\python39\lib\site-packages\flask_restx\__init__.py", line 5, in <module>
File "c:\users\User\appdata\local\programs\python\python39\lib\site-packages\flask_restx\api.py", line 50, in <module>
from .swagger import Swagger
File "c:\users\User\appdata\local\programs\python\python39\lib\site-packages\flask_restx\swagger.py", line 18, in <module>
from werkzeug.routing import parse_rule
ImportError: cannot import name 'parse_rule' from 'werkzeug.routing' (c:\users\User\appdata\local\programs\python\python39\lib\site-packages\werkzeug\routing\__i
nit__.py)
Run Code Online (Sandbox Code Playgroud)
我的要求.txt
Flask~=2.1.2
psycopg2-binary==2.9.3
Flask-SQLAlchemy==2.5.1
flask-restx==0.5.1
qrcode~=7.3.1
PyPDF2==2.6.0
reportlab~=3.6.10
WTForms~=3.0.1
flask-bootstrap==3.3.7.1
flask-wtf==1.0.1
Run Code Online (Sandbox Code Playgroud) 当我尝试从 导入字段时出现上述错误flask_restx。
from flask_restx import fields
Run Code Online (Sandbox Code Playgroud)
问题是什么。它可以在我的本地计算机上运行,但不能在远程计算机上运行。
完整的错误跟踪:
File "/root/.clearml/venvs-builds/3.8/lib/python3.8/site-packages/clearml/binding/import_bind.py", line 54, in __patched_import3
mod = builtins.__org_import__(
File "/root/.clearml/venvs-builds/3.8/lib/python3.8/site-packages/flask_restx/__init__.py", line 4, in <module>
from . import fields, reqparse, apidoc, inputs, cors
File "/root/.clearml/venvs-builds/3.8/lib/python3.8/site-packages/clearml/binding/import_bind.py", line 54, in __patched_import3
mod = builtins.__org_import__(
File "/root/.clearml/venvs-builds/3.8/lib/python3.8/site-packages/flask_restx/fields.py", line 16, in <module>
from flask import url_for, request
File "/root/.clearml/venvs-builds/3.8/lib/python3.8/site-packages/clearml/binding/import_bind.py", line 54, in __patched_import3
mod = builtins.__org_import__(
File "/root/.clearml/venvs-builds/3.8/lib/python3.8/site-packages/flask/__init__.py", line 4, in <module>
from . import json as json
File "/root/.clearml/venvs-builds/3.8/lib/python3.8/site-packages/clearml/binding/import_bind.py", line 54, in __patched_import3 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用flask-restx 和marshmallow 创建一个安静的网络服务。
我使用棉花糖进行请求和响应验证。
由于 Flask-restx api 文档不支持 swagger ui 中的棉花糖模式,我想使用 doc 装饰器添加它。
控制器代码:
@ns.route('/')
class Test(Resource):
@ns.doc(params={'test': 'test'})
def get(self):
_input_schema = MySchema()
errors = _input_schema.validate(request.args)
if errors:
return Response(str(errors), status=400)
other_things()
Run Code Online (Sandbox Code Playgroud)
架构代码:
class MySchema(Schema):
title = fields.Str()
id = fields.Integer()
slug = fields.Str()
Run Code Online (Sandbox Code Playgroud)
我正在尝试自动将参数从 schema 添加到 api 文档,如下所示
@ns.doc(params=MySchema.ReturnAFieldDict())
Run Code Online (Sandbox Code Playgroud)
它会给出类似的东西
@ns.doc(params={"title":"A string", "id": "Int value with min and max", "slug":"A str"})
Run Code Online (Sandbox Code Playgroud)
有什么办法可以做到这一点吗?
我有以下架构文档
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "foo",
"definitions": {
"stuff": {
"type": "object",
"properties": {
"id": {
"description": "the id",
"type": "string"
},
"type": {
"description": "the type",
"type": "string"
}
},
"oneOf": [{
"required": ["id"]
}, {
"required": ["type"]
}],
},
},
"type": "object",
"properties": {
"bar": {
"description": "blah",
"type": "object",
"additionalProperties": {
"$ref": "#/definitions/stuff"
}
}
},
"required": ["bar"]
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建 Flask Restx 模型,但我不确定如何对所需的 OneOf 字段进行建模?
我认为以下内容可行,但它忽略了 oneof 要求。
stuff_model = (
"Stuff Model",
"id": fields.String(description="the id", required=False), …Run Code Online (Sandbox Code Playgroud) 和:
@api.marshal_with(response_model, code=200)
Run Code Online (Sandbox Code Playgroud)
response_model我们可以使用预定义的响应模型和状态代码来编组响应。
我的问题是,假设我们对请求运行验证,并且希望抛出 400 错误。
是否可以使用不同的模型和不同的代码来编组相同的方法:
@api.marshal_with(response_model_2, code=400)
Run Code Online (Sandbox Code Playgroud) 我有一个使用flask-restx和的 Flask 应用程序flask-login。我希望默认情况下所有路由都需要登录,并明确定义不需要身份验证的公共路由。我已经按照这个问题中给出的例子开始使用装饰器:
使 Flask-Login 的 login_required 成为默认值的最佳方法
它适用于函数端点,但不适用于restx资源端点。
我尝试将函数添加为装饰器,并使用该method_decorators字段。例如:
def public_route(decorated_function):
"""
This is a decorator to specify public endpoints in our flask routes
:param decorated_function:
:return:
"""
decorated_function.is_public = True
return decorated_function
class HelloWorld(ConfigurableResource):
method_decorators = {"get": [public_route]}
@public_route
@api.doc('Welcome message')
def get(self):
return {'hello': 'world'}
Run Code Online (Sandbox Code Playgroud)
这个测试通过了:
def test_hello_world_is_public():
api = Namespace('health', description='Health related operations')
hello = HelloWorld(api, config=None, logger=None)
is_public_endpoint = getattr(hello.get, 'is_public', False)
assert is_public_endpoint
Run Code Online (Sandbox Code Playgroud)
我的挑战是我看不到如何在我的身份验证逻辑中访问这个属性:
@app.before_request
def …Run Code Online (Sandbox Code Playgroud) Flask-RESTful 和 Flask-RESTx 有什么区别?使用 Flask-RESTx 比 Flask-RESTful 更有优势吗?
总之,我一直在遵循 Flask Restx 教程来制作 API,但是我的端点都没有出现在 swagger 页面上(“规范中没有定义操作!”),每当我调用它们时,我都会得到 404
我主要按照这个https://flask-restx.readthedocs.io/en/latest/scaling.html创建了我的 api
我使用 python 3.8.3 作为参考。
我正在做的事情的简化示例如下。
简而言之,我的问题是,我错过了什么?目前对于为什么这行不通还一无所知。
project/
- __init__.py
- views/
- __init__.py
- test.py
manage.py
requirements.txt
Run Code Online (Sandbox Code Playgroud)
要求.txt
Flask-RESTX==0.2.0
Flask-Script==2.0.6
Run Code Online (Sandbox Code Playgroud)
管理.py
from flask_script import Manager
from project import app
manager = Manager(app)
if __name__ == '__main__':
manager.run()
Run Code Online (Sandbox Code Playgroud)
项目/初始化.py
from flask import Flask
from project.views import api
app = Flask(__name__)
api.init_app(app)
Run Code Online (Sandbox Code Playgroud)
项目/视图/ init .py
from flask_restx import Api, Namespace, fields
api = Api(
title='TEST API',
version='1.0', …Run Code Online (Sandbox Code Playgroud)