python flask request params

来源:互联网 发布:Ubuntu chrome设置中文 编辑:程序博客网 时间:2024/05/16 02:33

发现flask获取request参数有些不方便,没有像rails的params这样的东西,找了下github,发现有人写了这样的一个助手类,在此基础上改了下,代码如下


#coding=utf-8from __future__ import with_statementfrom functools import reducefrom flask import requestclass ParamRequiredError(Exception):    def __init__(self, value):        self.value = value    def __str__(self):        return repr(self.value)class Params(object):    def __init__(self, base_params=None, is_parse=True):        self._params = base_params or {}        if is_parse:            # request.args : A MultiDict with the parsed contents of the query string            self.__init_args(request.args)            if request.view_args is not None:                self.__setup_args(request.view_args)            # request.json : If the mimetype is application/json this will contain the parsed JSON data. Otherwise this will be None.            if request.json:                self.__setup_args(request.json)            else:                if request.files:                    self.__setup_args(request.files)                self.__setup_body(request.form.items(multi=True))    def __init_args(self, args):        for k, v in args._iter_hashitems():            if isinstance(v, list) and len(v) == 1:                self._params[k] = v[0]            else:                self._params[k] = v    def __setup_args(self, args):        self._params.update(args)    def __setup_body(self, items):        queries = []        for k, v in items:            keys = self._parse_keys(k)            queries.append(reduce(lambda res, key: {key: res} if key != '' else [res], reversed(keys), v))        [self.__setup_params(params) for params in queries]    def params(self):        return self._params    def __setup_params(self, other):        def deep_merge(a, b):            for k, v in b.items():                if isinstance(v, dict) and k in a:                    deep_merge(a[k], v)                elif isinstance(v, list) and k in a and isinstance(a[k], list):                    a[k].extend(v)                else:                    a[k] = v        deep_merge(self._params, other)    def __getattr__(self, item):        return getattr(self._params, item)    def __getitem__(self, item):        return self._params[item]    def param_required(self, key):        if key not in self._params:            raise ParamRequiredError(key)        return Params(self._params[key], is_parse=False)    def require(self,*keys):        for key in keys:            if key not in self._params:                raise ParamRequiredError(key)            if not self._params[key]:                raise ParamRequiredError(key)        return Params(self._params, is_parse=False)    def permit(self, *args):        params = dict()        for k in args:            if k in self._params:                if self._params[k]:                    params[k] = self._params[k]        return Params(params, is_parse=False)    @classmethod    def _parse_keys(cls, keys):        if '[' in keys or ']' in keys:            return keys.replace(']', '').split('[')        else:            return [keys]def get_request_params(base_params=None):    if not hasattr(request, '_request_params'):        setattr(request, '_request_params', Params(base_params))    return getattr(request, '_request_params')def bind_request_params(attr_name='params'):    setattr(request, attr_name, get_request_params())

使用

1、@app.before_request(bind_request_params)


2、@app.errorhandler(ParamRequiredError)
    def param_required(error):
        return error_with_msg("参数 %s 缺少或者为空 " % (error.value))


3、username = request.params.require('username').get('username')

1 0
原创粉丝点击