.. _reqparse: è¯·æ±‚è§£æž =============== .. currentmodule:: flask.ext.restful Flask-RESTful çš„è¯·æ±‚è§£æžæŽ¥å£æ˜¯æ¨¡ä»¿ ``argparse`` 接å£ã€‚å®ƒè®¾è®¡æˆæä¾›ç®€å•并且统一的访问 Flask ä¸ :py:class:`flask.request` 对象里的任何å˜é‡çš„å…¥å£ã€‚ åŸºæœ¬å‚æ•° --------------- 这里是请求解æžä¸€ä¸ªç®€å•的例å。它寻找在 :py:attr:`flask.Request.values` å—å…¸é‡Œçš„ä¸¤ä¸ªå‚æ•°ã€‚一个类型为 ``int``,å¦ä¸€ä¸ªçš„类型是 ``str`` :: from flask.ext.restful import reqparse parser = reqparse.RequestParser() parser.add_argument('rate', type=int, help='Rate cannot be converted') parser.add_argument('name', type=str) args = parser.parse_args() å¦‚æžœä½ æŒ‡å®šäº† help 傿•°çš„值,在解æžçš„æ—¶å€™å½“类型错误被触å‘的时候,它将会被作为错误信æ¯ç»™å‘ˆçŽ°å‡ºæ¥ã€‚å¦‚æžœä½ æ²¡æœ‰æŒ‡å®š help ä¿¡æ¯çš„è¯ï¼Œé»˜è®¤è¡Œä¸ºæ˜¯è¿”回类型错误本身的信æ¯ã€‚ 默认下,arguments **䏿˜¯** 必须的。å¦å¤–ï¼Œåœ¨è¯·æ±‚ä¸æä¾›çš„å‚æ•°ä¸å±žäºŽ RequestParser 的一部分的è¯å°†ä¼šè¢«å¿½ç•¥ã€‚ å¦è¯·æ³¨æ„:在请求解æžä¸å£°æ˜Žçš„傿•°å¦‚果没有在请求本身设置的è¯å°†é»˜è®¤ä¸º ``None``。 å¿…éœ€çš„å‚æ•° ------------------ è¦æ±‚ä¸€ä¸ªå€¼ä¼ é€’çš„å‚æ•°ï¼Œåªéœ€è¦æ·»åŠ ``required=True`` æ¥è°ƒç”¨ :py:meth:`~reqparse.RequestParser.add_argument`。 :: parser.add_argument('name', type=str, required=True, help="Name cannot be blank!") 多个值&列表 ----------------------- å¦‚æžœä½ è¦æŽ¥å—一个键有多个值的è¯ï¼Œä½ å¯ä»¥ä¼ å…¥ ``action='append'`` :: parser.add_argument('name', type=str, action='append') è¿™å°†è®©ä½ åšå‡ºè¿™æ ·çš„æŸ¥è¯¢ :: curl http://api.example.com -d "Name=bob" -d "Name=sue" -d "Name=joe" ä½ çš„å‚æ•°å°†ä¼šåƒè¿™æ · :: args = parser.parse_args() args['name'] # ['bob', 'sue', 'joe'] å…¶å®ƒç›®æ ‡ï¼ˆDestinations) -------------------------- 如果由于æŸç§åŽŸå› ï¼Œä½ æƒ³è¦ä»¥ä¸åŒçš„åç§°å˜å‚¨ä½ çš„å‚æ•°ä¸€æ—¦å®ƒè¢«è§£æžçš„æ—¶å€™ï¼Œä½ å¯ä»¥ä½¿ç”¨ ``dest`` kwarg。 :: parser.add_argument('name', type=str, dest='public_name') args = parser.parse_args() args['public_name'] 傿•°ä½ç½® ------------------ 默认下,:py:class:`~reqparse.RequestParser` 试ç€ä»Ž :py:attr:`flask.Request.values`ï¼Œä»¥åŠ :py:attr:`flask.Request.json` è§£æžå€¼ã€‚ 在 :py:meth:`~reqparse.RequestParser.add_argument` ä¸ä½¿ç”¨ ``location`` 傿•°å¯ä»¥æŒ‡å®šè§£æžå‚æ•°çš„ä½ç½®ã€‚:py:class:`flask.Request` ä¸ä»»ä½•å˜é‡éƒ½èƒ½è¢«ä½¿ç”¨ã€‚例如: :: # Look only in the POST body parser.add_argument('name', type=int, location='form') # Look only in the querystring parser.add_argument('PageSize', type=int, location='args') # From the request headers parser.add_argument('User-Agent', type=str, location='headers') # From http cookies parser.add_argument('session_id', type=str, location='cookies') # From file uploads parser.add_argument('picture', type=werkzeug.datastructures.FileStorage, location='files') 多个ä½ç½® ------------------ é€šè¿‡ä¼ å…¥ä¸€ä¸ªåˆ—è¡¨åˆ° ``location`` ä¸å¯ä»¥æŒ‡å®š **多个** 傿•°ä½ç½®:: parser.add_argument('text', location=['headers', 'values']) åˆ—è¡¨ä¸æœ€åŽä¸€ä¸ªä¼˜å…ˆå‡ºçŽ°åœ¨ç»“æžœé›†ä¸ã€‚(例如:location=['headers', 'values'],解æžåŽ 'values' 的结果会在 'headers' å‰é¢ï¼‰ ç»§æ‰¿è§£æž ------------------ å¾€å¾€ä½ ä¼šä¸ºä½ ç¼–å†™çš„æ¯ä¸ªèµ„æºç¼–写ä¸åŒçš„è§£æžå™¨ã€‚è¿™æ ·åšçš„问题就是如果解æžå™¨å…·æœ‰å…±åŒçš„傿•°ã€‚䏿˜¯é‡å†™ï¼Œä½ å¯ä»¥ç¼–å†™ä¸€ä¸ªåŒ…å«æ‰€æœ‰å…±äº«å‚数的父解æžå™¨æŽ¥ç€ä½¿ç”¨ :py:meth:`~reqparse.RequestParser.copy` æ‰©å……å®ƒã€‚ä½ ä¹Ÿå¯ä»¥ä½¿ç”¨ :py:meth:`~reqparse.RequestParser.replace_argument` è¦†ç›–çˆ¶çº§çš„ä»»ä½•å‚æ•°ï¼Œæˆ–者使用 :py:meth:`~reqparse.RequestParser.remove_argument` å®Œå…¨åˆ é™¤å‚æ•°ã€‚ 例如: :: from flask.ext.restful import RequestParser parser = RequestParser() parser.add_argument('foo', type=int) parser_copy = parser.copy() parser_copy.add_argument('bar', type=int) # parser_copy has both 'foo' and 'bar' parser_copy.replace_argument('foo', type=str, required=True, location='json') # 'foo' is now a required str located in json, not an int as defined # by original parser parser_copy.remove_argument('foo') # parser_copy no longer has 'foo' argument