带Flask的API:hand参数到基于URL的blueprint(为每个视图强制URL参数)

2024-05-15 00:55:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我想快速建立一个API作为草稿,我发现Flask具有我想要的轻量级。在

然而,作为Flask的新手,我仍然不确定如何设计我的文件布局,使之变得漂亮和清晰,以便与多个贡献者一起工作,以便随着时间的推移充实API。在

所以到目前为止,我需要蓝图,包括我从其他模块的路线。那就像一个符咒。但现在让我们来处理棘手的部分。在

我们的数据库是这样设计的,即我们对几种语言使用相同的表。在

对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,以后仍然需要我验证该语言是否可用。在

我想验证语言(必须给出)是否有效,如果没有返回错误。在

^{pr2}$

因此,如果验证失败,则返回一个错误,如果没有失败,我可以在我所有的函数中假设lang代码存在于某处(可能在g)并且是可访问的


Tags: 文件函数代码api语言flask路由参数
2条回答

您可以将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变量名。在

我不确定这是不是该走的路,但我偶然发现了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)"})

相关问题 更多 >

    热门问题