获取请求

dealer参数

每个参数可以设置类型和默认值。如果前端传入的参数无法转成对应的类型或者没有设置默认值,框架就会内部抛出BadParamError错误。默认情况下,这会使前端收到400 Bad Request错误。

框架不支持可变长参数(即带*的参数)的函数作为dealer。

框架会调用类型的__init__方法来解析前端传入的参数,例如:

from lessweb import Application
from datetime import datetime

def f(d: datetime):
    return str(d)

app = Application()
app.add_post_mapping('/', f)
app.run()

下面的请求可以被正常解析:

>>> import requests
>>> resp = requests.post('http://localhost:8080', json={'d': [2020, 1, 2]})
>>> resp.text  # 相当于d=datetime(*[2020, 1, 2])
'2020-01-02 00:00:00'
>>> resp = requests.post('http://localhost:8080', json={'d': {'year': 2020, 'month': 2, 'day': 3}})
>>> resp.text  # 相当于d=datetime(**{'year': 2020, 'month': 2, 'day': 3})
'2020-02-03 00:00:00'

但如果需要解析ISO格式的字符串,就必须把datetime包装成一个新类型,并实现__init__方法,例如:

from lessweb import Application
from datetime import datetime
import dateutil.parser

class Datetime:
    at: datetime
    def __init__(self, s: str) -> None:
        self.at = dateutil.parser.parse(s)

    def __str__(self) -> str:
        return str(self.at)

def f(d: Datetime):
    return str(d)

app = Application()
app.add_post_mapping('/', f)
app.run()

下面的请求就可以被正常解析:

>>> import requests
>>> resp = requests.post('http://localhost:8080', json={'d': '2020-01-02T18:30:00.000000+08:00'})
>>> resp.text
'2020-01-02 18:30:00+08:00'
>>> resp = requests.post('http://localhost:8080?d=2020-01-02T18:30:00.000000%2B08:00')
>>> resp.text
'2020-01-02 18:30:00+08:00'

注意:dateutil是一个第三方库,可执行pip3 install python-dateutil进行安装。

Positional-only参数

如果dealer的参数的类型是Model,并且这个参数还是Positional-only参数,前端的请求参数会直接传入它的各个成员。

示例

from lessweb import Application

class Book:
    id: int
    name: str
    author: str

def edit_book(book: Book, /):
    return book

app = Application()
app.add_put_mapping('/book/{id}', dealer=edit_book)
app.run()

请求: curl -X PUT -d "name=sicp&author=MIT" "http://localhost:8080/book/123"
返回: {"id": 123, "name": "sicp", "author": "MIT"}

List类型参数

如果dealer参数的类型为List[T],则可以解析数组类型的JSON请求,例如:

from typing import List
from lessweb import Application

class Book:
    id: int
    name: str
    author: str

def edit_books(books: List[Book], /):
    return books

app = Application()
app.add_put_mapping('/book', dealer=edit_books)
app.run()
>>> import requests
>>> resp = requests.put('http://localhost:8080/book', json=[{'name': 'sicp', 'author': 'MIT'}])
>>> resp.text
'[{"name": "sicp", "author": "MIT"}]'