我想快速设置一个API作为草稿,我发现Flask带有我想要的轻量级。
然而,作为Flask的新手,我仍然不确定如何设计我的文件布局,以便与多个贡献者合作,以便随着时间的推移充实API。
所以到目前为止,我需要Blueprints来包含来自其他模块的路由。这就像一个魅力。但现在让我们去寻找棘手的部分。
我们的数据库的设计方式与多种语言相同。
API的访问权限将是每种语言,因此将语言用作参数并没有多大意义,语言对于确定我们在哪些表上行动非常重要。这是根据每个请求完成的。
基本上我希望API看起来像这样:
/v1.0/<language-code>/entries
/v1.0/<language-code>/sentences
旁注:
参赛作品的路线来自v1/entries/access.py
。
(我建议将我的api的实体打包成更好的文件结构方案)
那么如何确保我的观点(路线链接的功能)知道请求了哪个language-code
。
是否有一种很好的方法可以通过在应用程序中全局使用参数来实现它,或者我应该从请求的URL中提取它?
我也是开放的黑客! :3
//编辑: 我发现了这个:http://flask.pocoo.org/docs/0.10/patterns/urlprocessors/ 然而,进入正确的方向,提取语言代码并将其写入g,以后仍需要我验证语言是否可用。
我想验证语言(必须提供)是否有效,如果没有返回错误。
@app.url_value_preprocessor
def pull_lang_code(endpoint, values):
// do some verification in here
if values:
g.lang_code = values.pop('lang_code', None)
因此,如果验证失败,则回复错误,如果没有失败,我可以在我的所有函数中假设lang-code存在于某处(可能在g
中)并且可以访问
答案 0 :(得分:1)
你可以将language_code
作为函数的参数。
blueprint = Blueprint('entries', __name__)
@blueprint.route('/v1.0/<language_code>/entries')
def get_entries(language_code):
return jsonify({'result': "your language code is " + language_code})
不允许使用名称language-code
,参数名称应该是有效的python变量名。
答案 1 :(得分:0)
我不确定这是否可行,但我偶然发现before_request
装饰师,这似乎做了我想做的事情:
from flask import Flask, g, abort, jsonify, request
from v1.entries import access as entry_access
app = Flask(__name__)
# load the endpoints
PRE = "/v1.0/<lang_code>"
app.register_blueprint(entry_access.entries, url_prefix=PRE+"/entries")
@app.before_request
def verify_language():
# check if there are any parameters in the url and get lang_code
url_params = request.view_args
lang = (url_params and url_params.pop('lang_code', None)) or None
# if lang_code is given, make sure it is valid
if lang:
LANG = ["eng-code", "swe-code"]
if lang in LANG or lang == "global":
# set globally to provide access for all views
g.lang = lang
else:
return jsonify({"error": "Invalid Parameters (lang_code)"})