我正在使用 Flask 开发 REST api。我的端点之一应该支持过滤和排序。假设我有这些字段:类别、颜色、严重性。
假设我想获取类别为“a”或“b”且颜色为黑色的所有项目,并按严重的升序和颜色降序对其进行排序。
对于排序,我看到前面的“+”或“-”是设置顺序的一种方法。
1.解码过滤器表达式的最佳实践是什么?假设我想使用查询字符串方法在 get 请求中传递参数(或者最好的选择是使用 json-body 参数来满足此需要)
2. 在flask框架中解析它的最佳方法是什么?
my_ip/items?sort=+severity&sort=-color&filter=???
我最近开始学习Flask框架,并编写了一个简短的程序来理解request/response
Flask中的循环。
我的问题是最后调用的方法calc
不起作用。
我发送请求为:
我收到错误:
“未找到:在服务器上未找到请求的 URL。如果您手动输入 URL,请检查拼写并重试。”
下面是我的烧瓶应用程序代码:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return "<h1>Hello, World!</h1>"
@app.route('/user/<name>')
def user(name):
return '<h1>Hello, {0}!</h1>'.format(name)
@app.route('/math/calculate/<string:var1>/<int:var2>')
def calc(var1, var2):
return '<h1>Result: {0}!</h1>'.format(int(var1)+int(var2))
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80, debug=True)
Run Code Online (Sandbox Code Playgroud) 我是rest
用 Flask写的flask-marshmallow
模型.py
class Application(db.Model):
__tablename__ = 'applications'
id = db.Column(db.String(), primary_key=True)
name = db.Column(db.String())
versions = db.relationship('Version', backref='application', lazy=True)
def __repr__(self):
return '<application {}>'.format(self.name)
class Version(db.Model):
__tablename__ = 'versions'
id = db.Column(db.String(), primary_key=True)
file = db.Column(db.String(80), nullable=True)
application_id = db.Column(db.Integer, db.ForeignKey('applications.id'))
Run Code Online (Sandbox Code Playgroud)
谢马斯.py
class ApplicationDetailSchema(ma.Schema):
class Meta:
fields = ('id', 'name', 'versions')
Run Code Online (Sandbox Code Playgroud)
路线.py
@bp.route("/<id>")
def application_detail(id):
application = Application.query.get(id)
result = application_detail_schema.dump(application)
return jsonify(result)
Run Code Online (Sandbox Code Playgroud)
类型错误:“版本”类型的对象不可 JSON 序列化
我对单元测试相当陌生,对 RESTful API 开发也比较陌生。我想知道如何对 Flask Restful 中的 Resource 类内的函数进行单元测试?我可以对端点的响应进行单元测试,但我不知道如何对端点控制器类内的各个函数进行测试。
下面是我的应用程序代码。它有3个文件,包括测试:
# api.py
from flask import Flask
from flask_restful import Api
from .controller_foo import ControllerFoo
def create_app(config=None):
app = Flask(__name__)
app.config['ENV'] ='development'
return app
application = app = create_app()
api = Api(app)
api.add_resource(ControllerFoo, '/ctrl')
if __name__ == "__main__":
app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)
# controller_foo.py
from flask_restful import Resource
from flask import request
class ControllerFoo(Resource):
"""
basically flask-restful's Resource method is a wrapper for flask's MethodView
"""
def post(self):
request_data = self.handle_request() …
Run Code Online (Sandbox Code Playgroud) 在特定情况下,我想以text/html
内容类型响应错误,如下所示:
class MyResource(Resource):
def get(self):
if some_condition:
return 'bad argument', 400
Run Code Online (Sandbox Code Playgroud)
上面的代码返回一个application/json
内容类型:'"bad argument"'
而不是一个text/html
内容类型:'bad argument'
如何强制flask-restful 响应text/html
内容类型?
我正在尝试在Flask中创建一个REST API。问题是它可以完美运行几天,然后突然完全停止接收请求。忘了不响应请求;它只是一开始没有收到任何请求。这是我的脚本:
from flask import Flask, jsonify
from flask_restful import Resource, Api
from flask_restful import reqparse
from sqlalchemy import create_engine
from flask.ext.httpauth import HTTPBasicAuth
from flask.ext.cors import CORS
conn_string = "mssql+pyodbc://x"
e = create_engine(conn_string)
auth = HTTPBasicAuth()
@auth.get_password
def get_password(username):
if username == 'x':
return 'x'
return None
app = Flask(__name__)
cors = CORS(app)
api = Api(app)
class Report(Resource):
decorators = [auth.login_required]
def get(self):
parser = reqparse.RequestParser()
parser.add_argument('start', type = str)
parser.add_argument('end', type = str)
args = parser.parse_args()
conn = …
Run Code Online (Sandbox Code Playgroud) 我在开发期间使用了Flask的异常处理(@app.errorhander(MyException)
),即使对于来自Flask-Restful端点的异常也能正常工作.
然而,我注意到,切换到时debug=False
,瓶的RESTful走的是完全例外处理过(与此propagate_exceptions
是False
太).我喜欢Flask-Restful为所有未处理的异常发送内部服务器错误,但遗憾的是,对于那些具有Flask异常处理程序的人(当这些异常来自Flask-Restful端点时)也会发生这种情况.
有没有办法告诉Flask-Restful只处理Flask错误处理程序无法处理的异常?如果没有,我可以将某些异常类型排除在Flask-Restful处理之外,那么它们会被Flask处理吗?
我的最后一个选择是覆盖Flask-Restful Api.handle_error
并自己实现这个逻辑,但我想首先使用现有的API ...
我正在尝试Flask-RESTFUL
使用注册表模式注册我定义的所有资源.
from flask_restful import Resource
class ResourceRegistry(type):
REGISTRY = {}
def __new__(cls, name, bases, attrs):
new_cls = type.__new__(cls, name, bases, attrs)
cls.REGISTRY[new_cls.__name__] = new_cls
return new_cls
@classmethod
def get_registry(cls):
return dict(cls.REGISTRY)
class BaseRegistered(object):
__metaclass__ = ResourceRegistry
class DefaultResource(BaseRegistered, Resource):
@classmethod
def get_resource_name(cls):
s = re.sub('(.)([A-Z][a-z]+)', r'\1-\2', cls.__name__)
return '/' + re.sub('([a-z0-9])([A-Z])', r'\1-\2', s).lower()
Run Code Online (Sandbox Code Playgroud)
当整个事情发布时,我得到以下内容:
TypeError: Error when calling the metaclass bases
metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of …
Run Code Online (Sandbox Code Playgroud) 我有以下资源:
class Image(Resource):
def get(self, db_name, col_name, image_id):
col = mongo_client[db_name][col_name]
image = col.find_one({'_id':ObjectId(image_id)})
try:
image['_id'] = str(image['_id'])
except TypeError:
return {'image': 'notFound'}
return {'image':image}
Run Code Online (Sandbox Code Playgroud)
链接到某个端点。
但是,image
其中包含某些datetime
对象。我可以用`json.dumps(...,default = str)将其包装起来,但是我看到有一种在flask-restful上强制执行此方法的方法。对我来说还不清楚到底需要做什么。
我特别读到:
It is possible to configure how the default Flask-RESTful JSON
representation will format JSON by providing a RESTFUL_JSON
attribute on the application configuration.
This setting is a dictionary with keys that
correspond to the keyword arguments of json.dumps().
class MyConfig(object):
RESTFUL_JSON = {'separators': (', ', ': …
Run Code Online (Sandbox Code Playgroud) 我检查了一个使用Alembic的现有Flask-Restful项目,当我运行迁移时,我不得不合并不同的alembic头.我无法弄清楚这是怎么发生的 - 我从桌面推出并直接拉到笔记本电脑上.
我确实设法解决了这个问题并继续正常进行.
后来,我推送到Git并将项目拉回到我的桌面计算机上.当我试图跑
python manage.py db upgrade
Run Code Online (Sandbox Code Playgroud)
我明白了:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) column "logo" of relation "despatch_details" does not exist
[SQL: 'ALTER TABLE despatch_details DROP COLUMN logo']
Run Code Online (Sandbox Code Playgroud)
查看我桌面计算机上的数据库,我可以看到它超前于合并点.例如,合并后脚本尝试创建的某些表已经存在于我的桌面框上,并且alembic_version
位于合并点和最新迁移之间.
我已经尝试过手动编辑脚本并一个接一个地修复一个错误,但它只是在深入挖掘我.
我是否需要在桌面计算机上回滚到合并点,然后运行新的
python manage.py db upgrade
Run Code Online (Sandbox Code Playgroud)
我不能破解它,因为我想要的最后一件事是当我推送到暂存(目前在合并点后面)时遇到同样的问题.
如果我在我的桌面计算机上回滚并且升级再次失败,我将在哪里站立?
flask-restful ×10
flask ×7
python ×7
alembic ×1
azure ×1
content-type ×1
http ×1
httpresponse ×1
json ×1
query-string ×1
rest ×1
restful-url ×1
sqlalchemy ×1