一些上下文:
想要编写一个接受客户端门票的算法。根据某些约束对它们进行排序,处理它们,并将结果回复给客户端。
我做了一些研究,虽然 python 的 REST API 是一个好主意。但当我探索它时,我发现,它通常是为了一次处理一个请求而构建的。
有没有办法将任务(REST API 请求)添加到队列中,对它们进行排序并与工作人员一起执行它们,并在处理完成后回复客户端?
我正在使用 Flask 用 Python 编写一个应用程序,现在在为端点创建资源类期间,我收到 Pylint“实例属性过多”警告。现在我不再知道我正在做的是否是编写资源的“正确”方式。
我将依赖项注入到资源中,如下所示:
api.add_resource(TicketsQuery, '/tickets/query',
'/ticket/query/<int:ticketID>',
resource_class_kwargs={'cleaner': Cleaner(StrategyResponseTickets()),
'machine_cleaner': Cleaner(StrategyResponseMachines()),
'db': soap_caller,
'cache': cache,
'field_map': app.config['FIELD_FILTER_MAP']['TICKETS'],
'endpoint_permission': TicketsQueryPermission
})
Run Code Online (Sandbox Code Playgroud)
然后它作为 kwargs 参数显示在资源中。我还装饰了 init 内部的函数,因为我需要类中的变量(来进行装饰本身)。
class TicketsQuery(Resource):
def __init__(self, **kwargs):
# Dependencies
self.cleaner = kwargs['cleaner']
self.machine_cleaner = kwargs['machine_cleaner']
self.db = kwargs['db']
self.cache = kwargs['cache']
self.field_map = kwargs['field_map']
self.endpoint_permission = kwargs['endpoint_permission']
# Permissions of endpoint method calls, implemented using wrapper
self.get = authorization_required(self.endpoint_permission, UserType.GENERIC_EMPLOYEE)(self.get)
self.post = authorization_required(self.endpoint_permission, UserType.GENERIC_EMPLOYEE)(self.post)
def get(self, permission_set: TicketsPermissionSet, ticketID=-1):
Run Code Online (Sandbox Code Playgroud)
这是在 Flask 中编写资源的正确方法吗?或者有更好的结构可以遵循吗?任何见解或提示表示赞赏!
我有两个 API,其中一个基本上用于根据发送的数据生成 PDF。
下面是第一个 API 端点
http://localhost:5000/api/sendReceiptData
Run Code Online (Sandbox Code Playgroud)
以附件形式返回 PDF 文件。
第二个 API 将使用第一个 API,并应返回 PDF 作为响应中的附件。我已经尝试过,但出现此错误TypeError: Object of type bytes is not JSON serializable
因此,我如何从第二个 API 中的第一个 API 返回文件响应
我正在使用 Flask 和 Flask-RESTful 扩展开发一个 API。我正在创建端点和资源,但我对资源“url”及其“端点”之间的区别感到困惑。据我了解,URL 本身就是端点。我还阅读了StackOverflow 问题的答案,他们还建议 URL 是端点。
然而Flask-RESTful 文档提到该add_resource方法有一个 URL 参数,并且它还可以接收端点名称。他们甚至提供了这个例子:
api.add_resource(HelloWorld, '/', '/hello')
api.add_resource(Foo, '/foo', endpoint="foo")
api.add_resource(FooSpecial, '/special/foo', endpoint="foo")
Run Code Online (Sandbox Code Playgroud)
我明白他们在做什么,但我还是不明白端点名称的作用。
URL 和端点名称有什么区别?为什么我要设置端点名称?
我正在尝试使用flask_restful 使用Python 创建API。我有以下代码:
from flask import Flask
from flask_restful import Resource, Api, reqparse
app = Flask(__name__)
api = Api(app)
class Example(Resource):
def get(self):
parser = reqparse.RequestParser()
parser.add_argument('some_arg')
args = parser.parse_args()
return {"Param Entered": args['some_arg']}
api.add_resource(Example, '/')
if __name__ == '__main__':
app.run()
Run Code Online (Sandbox Code Playgroud)
在 Postman 中运行 GET 请求时:
GET <my_url>/?some_arg=<some_text>
Run Code Online (Sandbox Code Playgroud)
我收到错误:“message”:“浏览器(或代理)发送了该服务器无法理解的请求。”
有人可以解释一下为什么会出现这个错误,以及如何使用 parse_args() 为 Flask Restful 正确添加参数吗?谢谢你!
以下是来自flask-restful doc的示例代码
from flask import Flask
from flask.ext import restful
app = Flask(__name__)
api = restful.Api(app)
class HelloWorld(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)
这个HelloWorld类在同一个python文件中,比方说app.py,它有效.
现在我将把HelloWorld类放到一个单独的类文件中,如下面的布局:
app
app/__init__.py # hold above code except the HelloWorld class.
app/resource
app/resource/__init__.py # empty
app/resource/HelloWorld.py # hold the above HelloWorld class.
Run Code Online (Sandbox Code Playgroud)
该app/__init__.py包含:
from flask import Flask
from flask.ext import restful
from resource.HelloWorld import HelloWorld
app = Flask(__name__)
api …Run Code Online (Sandbox Code Playgroud) 我写了一个Flask应用程序。在这种情况下,我正在使用基本身份验证来限制某些POST API视图。从Python请求中,我可以按以下方式访问这些视图:
print post(url, json=data, auth=('username', 'password'))
Run Code Online (Sandbox Code Playgroud)
从卷曲
curl -a username:password -d "data" url
Run Code Online (Sandbox Code Playgroud)
如何在app.post中做同样的事情?我想auth,authorization等为参数,post但它们是无效的。
response = self.app.post(
url,
data=data,
headers={
'content-type': 'application/json'
},
follow_redirects=True
)
Run Code Online (Sandbox Code Playgroud) 我试图使用Flask Alchemy和Flask Marshmallow从数据库查询后返回json数据
但是,我的代码总是以某种方式返回空的JSON数据。
这是我的代码:
我的看法 :
@app.route('/customer/', methods=['GET'])
def get_customer():
customers = models.Customer.query.all()
#c = models.Customer.query.get(1) # Get Customer with an ID of 1
customers_schema = CustomerSchema()
print customers_schema.dump(customers).data
payload = customers_schema.dump(customers).data
resp = Response(response=payload, status=200, mimetype="application/json")
return(resp)
Run Code Online (Sandbox Code Playgroud)
我的模特:
class Customer(db.Model):
id = db.Column(db.Integer, primary_key=True)
nickname = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
address = db.relationship('Address', backref='customer', lazy='dynamic')
def __repr__(self):
return '<Customer %r>' % (self.nickname)
Run Code Online (Sandbox Code Playgroud)
我的架构:
class CustomerSchema(ma.ModelSchema):
class Meta:
model = Customer
Run Code Online (Sandbox Code Playgroud)
这是从控制台看到的结果:
* Debugger is …Run Code Online (Sandbox Code Playgroud) 我需要使用Postman将图像文件发送到Flask服务器。我确实使用网络浏览器和“渲染模板”发送了图像文件。但是当我使用Postman尝试相同的程序时,显示 "method not allowed"
。
我也尝试过/ upload,但是它说 "bad request"

我试图理解Flask-RESTful,但是我不知道如何为资源提供可选参数。
即:
class TodoSimple(Resource):
def get(self, todo_id):
return {todo_id: todos[todo_id]}
def put(self, todo_id):
todos[todo_id] = request.form['data']
return {todo_id: todos[todo_id]}
api.add_resource(TodoSimple, '/<string:todo_id>')
Run Code Online (Sandbox Code Playgroud)
在上述情况下,如何创建一个新的端点,该端点将返回所有待办事项,而不仅仅是一个?
摘自:https : //flask-restful.readthedocs.io/en/0.3.5/quickstart.html
flask-restful ×10
python ×9
flask ×7
api-design ×1
endpoint ×1
json ×1
postman ×1
pylint ×1
redis ×1
rest ×1