这是我的 Flask-Restful 应用程序中的 report_runner.py 中的 ReportRunner 类中的方法:
class ReportRunner(object):
def __init__(self):
pass
def setup_routes(self, app):
app.add_url_rule("/run_report", view_func=self.run_report)
def request_report(self, key):
# code #
def key_exists(self, key):
# code #
def run_report(self):
key = request.args.get("key", "")
if self.key_exists(key):
self.request_report(report_type, key)
return jsonify(message = "Success! Your report has been created.")
else:
response = jsonify({"message": "Error => report key not found on server."})
response.status_code = 404
return response
Run Code Online (Sandbox Code Playgroud)
鼻子测试调用与该路由关联的 URL
def setUp(self):
self.setup_flask()
self.controller = Controller()
self.report_runner = ReportRunner()
self.setup_route(self.report_runner)
def test_run_report(self):
rr …Run Code Online (Sandbox Code Playgroud) 我有一个简单的 Resource 类,它定义了一些 API 方法:
class RoomAPI(Resource):
def get(self):
# some code
def post(self):
# some code
def put(self):
# some code
Run Code Online (Sandbox Code Playgroud)
然后我像这样定义我的路线:
api.add_resource(RoomAPI,'/api/rooms/')
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:如何仅使用一个 Resource 类为每个 HTTP 方法创建不同的路由?
我想获得这样的 API:
GET /api/rooms/get/
POST /api/rooms/create/
PUT /api/rooms/update/
Run Code Online (Sandbox Code Playgroud) 我正在使用 Flask-Restful 开发 Restful API,其资源比我想在 app.py 中保留的资源多。所以我应用了建议的项目结构。现在我想从资源访问api.url_for()from app import api以生成一些链接,但似乎我必须这样做。
为了避免循环导入,我当前的解决方案是进行惰性导入。但还有更好的方法,对吗?
app.py:
from flask import Flask
from flask_restful import Api
from myapi.resources.foo import Foo
from myapi.resources.bar import Bar
from myapi.resources.baz import Baz
app = Flask(__name__)
api = Api(app)
api.add_resource(Foo, '/Foo', '/Foo/<str:id>')
api.add_resource(Bar, '/Bar', '/Bar/<str:id>')
api.add_resource(Baz, '/Baz', '/Baz/<str:id>')
Run Code Online (Sandbox Code Playgroud)
resource/foo.py(bar.py分别):
from flask_restful import Resource
from bar import Bar
class Foo(Resource):
def get(self):
from app import api
related = api.url_for(Bar, foo=self.id)
return {'Foo':self.id, 'related_bar':related}, …Run Code Online (Sandbox Code Playgroud) 我正在使用 Flask-RESTful 并希望通过向我的响应添加自定义 HTTP 标头来处理某些错误。是否有标准的 Flask 或 Flask-RESTful 方式来做到这一点?
我的 Flask 代码的一部分:
@app.route('/api/post', methods=['POST'])
def post():
body = request.get_json()
json_body = json.loads(body)
new_id = mongo.db.Projects.insert(json_body)
return str(new_id)
Run Code Online (Sandbox Code Playgroud)
用于发布新数据库条目的脚本:
payload = { 'ProjectName' : 'KdB Test Project' }
headers = {'Content-type': 'application/json', 'Accept': 'application/json'}
r = requests.post('http://localhost:5000/api/post', headers=headers, data=json.dumps(payload))
Run Code Online (Sandbox Code Playgroud)
我不断收到 json 解码器 TypeError 问题,例如
TypeError: expected string or buffer
2016-08-16 15:19:31,388 - werkzeug - INFO - 127.0.0.1 - - [16/Aug/2016 15:19:31] "POST /api/post HTTP/1.1" 500 -
Run Code Online (Sandbox Code Playgroud)
我尝试过几件事,包括。发布字符串。我发布字典的方式有什么问题吗?问题似乎出在 body = request.get_json() 处。我不认为我正在收集任何数据...
这一定是非常微不足道的,但我只是找不到在 Windows 服务器(win server 2008)上运行 Flask Web 服务的方法。我可以手动运行它,但是我如何将它作为服务启动,以便我可以使用它代码公开的服务。
这是我尝试部署到 Windows 服务器的一个简单示例:
from flask import Flask, request
from flask_restful import Resource, Api
from flask_cors import CORS
app = Flask(__name__);
CORS(app);
api = Api(app);
class Root(Resource):
def get(self):
return {'hello': 'world Root'}
api.add_resource(Root, '/');
if __name__ == '__main__':
app.run(debug=True)
Run Code Online (Sandbox Code Playgroud) 我目前正在使用Flask-RESTful构建REST API,并使用Flask-HTTPAuth来保护一些put和get方法.我想允许基于我存储在数据库中的预定义用户权限来访问这些方法.
我的问题是,如何修改或拦截下面函数的结果,以便根据端点/方法改变访问权限?清除基本身份验证后,我希望能够检查用户是否在我的数据库中具有相关权限.使用Flask-Session这很简单,但这里的API是无状态的.
@auth.verify_password
def verify_password(user, password):
query_set = models.User.objects(username=user)
if query_set:
return helpers.verify(password, query_set[0].password)
else:
return False
Run Code Online (Sandbox Code Playgroud)
非常感谢你.
我正在 python Flask 中创建一条路线,它将作为其余 api 来注册用户。当我尝试在 POST 方法中获取通过邮递员传递的 json 数据时,出现错误TypeError: 'NoneType' object is not subscriptable
我来自邮递员的请求:
http://127.0.0.1:5000
/register 原始输入:{"username":"alok","password":"1234"}
我的路线和功能:
@app.route('/register', methods=['GET', 'POST'])
def signup_user():
data = request.get_json()
return data['username']
Run Code Online (Sandbox Code Playgroud)
据我所知,上述函数应该返回:“ alok ”
但我收到错误:TypeError: 'NoneType' object is not subscriptable
任何帮助将不胜感激
我想创建一个变量,该变量将在整个切片期间保持每个静态服务调用的请求对象。我不确定在Flask中处理它的最佳方法是什么。我正在使用Flask + Mongoengine。这样做的原因是因为我想将相同的信息传递给每个CRUD操作以记录请求。
将
g
是正确的选择还是其他?
我对RESTful API比较新,所以我当然不能正确设计它.
我想根据正在进行身份验证的人从/ api/users/[user_id]返回JSON用户对象的不同子集.因此,如果用户"alice"试图访问/ api/users/alice,她将获得更多她的信息(例如私人设置等),而不是用户"bob",她只是简单地获取她的公开个人资料.
我目前正在使用flask_restful和httpbasicauth.现在我有以下内容:
class UserAPI(flask_restful.Resource):
@g.auth.login_required
def get(self, username):
# here is where I want to get the HTTPBasicAuth username
# to determine how much data to return
user = User.objects(username=username).exclude('password').first()
if user is not None:
return user.to_json()
else:
flask_restful.abort(404, message='User not found: ' + username)
Run Code Online (Sandbox Code Playgroud)
问题是我似乎无法找到一种清晰的方法来获取HTTP基本身份验证数据.我知道我可以解析请求并解码base-64数据,但我觉得我不应该这样做.或者,更好的是,找到一种方法将user_id从/ api/users/[user_id]传递到login_required注释中.
我觉得这将是一个非常常见的用例,所以我无法弄清楚为什么我在这个领域找不到任何东西.我设计这个完全错了吗?
非常感谢!