1.查看Sanic的request有什么
参数(其中有些是方法或实例)
直接用浏览器访问http://127.0.0.1:8899/cc?p=pp
dir(request)
可以查看
# sanic的中间件
@app.middleware("request")
async def middleware_1(request):
d = {
'accept':request.accept,
'app':request.app,
'args':request.args,
'body':request.body,
'conn_info':request.conn_info,
'content_type':request.content_type,
'cookies':request.cookies,
'credentials':request.credentials,
'ctx':request.ctx,
'endpoint':request.endpoint,
'files':request.files,
'form':request.form,
'forwarded':request.forwarded,
'generate_id':request.generate_id,
'get_args':request.get_args,
'get_query_args':request.get_query_args,
'head':request.head,
'headers':request.headers,
'host':request.host,
'id':request.id,
'ip':request.ip,
'json':request.json,
'load_json':request.load_json,
'match_info':request.match_info,
'method':request.method,
'name':request.name,
'parsed_accept':request.parsed_accept,
'parsed_args':request.parsed_args,
'parsed_credentials':request.parsed_credentials,
'parsed_files':request.parsed_files,
'parsed_form':request.parsed_form,
'parsed_forwarded':request.parsed_forwarded,
'parsed_json':request.parsed_json,
'parsed_not_grouped_args':request.parsed_not_grouped_args,
'parsed_token':request.parsed_token,
'path':request.path,
'port':request.port,
'protocol':request.protocol,
'query_args':request.query_args,
'query_string':request.query_string,
'raw_headers':request.raw_headers,
'raw_url':request.raw_url,
'receive_body':request.receive_body,
'remote_addr':request.remote_addr,
'request_line':request.request_line,
'request_middleware_started':request.request_middleware_started,
'reset_response':request.reset_response,
'respond':request.respond,
'responded':request.responded,
'route':request.route,
'scheme':request.scheme,
'server_name':request.server_name,
'server_path':request.server_path,
'server_port':request.server_port,
'socket':request.socket,
'stream':request.stream,
'token':request.token,
'transport':request.transport,
'uri_template':request.uri_template,
'url':request.url,
'url_for':request.url_for,
'version':request.version
}
print(d)
结果
bound的都是方法
# url生成
url_for(self, view_name: str, **kwargs) -> str
# json反序列化
load_json(self, loads=json_loads) -> str
# 返回uuid,是一个类方法(classmethod)
generate_id(*_) -> uuid.uuid4()
# 处理body
receive_body()
if not self.body:
self.body = b"".join([data async for data in self.stream])
# 重置响应
reset_response()
stream.response.stream = None
stream.response = None
responded = False
# 返回response
respond(...)
# 路由对象
route: Optional[Route]
# 传输协议
transport: TransportProtocol
#连接信息: ip、port、socket都是从conn_info获取的
conn_info: Optional[ConnInfo]
# 解析分组参数: DefaultDict[Tuple[bool, bool, str, str], RequestParameters]
parsed_args = defaultdict(RequestParameters)
# 解析未分组的参数: DefaultDict[Tuple[bool, bool, str, str], List[Tuple[str, str]]]
parsed_not_grouped_args= defaultdict(list)
# 协议
protocol = transport.get_protocol()
{
'accept': ['text/html', 'application/xhtml+xml', 'image/avif', 'image/webp', 'image/apng', 'application/signed-exchange;v=b3;q=0.9', 'application/xml;q=0.9', '*/*;q=0.8'],
'app': Sanic(name="test"),
'args': {'p': ['pp']},
'body': b'',
'conn_info': <sanic.models.server_types.ConnInfo object at 0x10acd5940>,
'content_type': 'application/octet-stream',
'cookies': {'csrftoken': '1I4Acx73SpNtbOSwXfGhzkwkvBK1TdyLqBsFPCRj04XkL3uKMv6Orn7TYX4Rlbij'},
'credentials': None,
'ctx': namespace(),
'endpoint': 'test.cc',
'files': {},
'form': {},
'forwarded': {},
'generate_id': <bound method Request.generate_id of <class 'sanic.request.Request'>>,
'get_args': {'p': ['pp']},
'get_query_args': [('p', 'pp')],
'head': b'GET /cc?p=pp HTTP/1.1\r\nHost: 127.0.0.1:8899\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nsec-ch-ua: " Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"\r\nsec-ch-ua-mobile: ?0\r\nsec-ch-ua-platform: "macOS"\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nSec-Fetch-Site: none\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-User: ?1\r\nSec-Fetch-Dest: document\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9,zh-TW;q=0.8\r\nCookie: csrftoken=1I4Acx73SpNtbOSwXfGhzkwkvBK1TdyLqBsFPCRj04XkL3uKMv6Orn7TYX4Rlbij',
'headers': <Header('host': '127.0.0.1:8899', 'connection': 'keep-alive', 'cache-control': 'max-age=0', 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"macOS"', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'sec-fetch-site': 'none', 'sec-fetch-mode': 'navigate', 'sec-fetch-user': '?1', 'sec-fetch-dest': 'document', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9,zh-TW;q=0.8', 'cookie': 'csrftoken=1I4Acx73SpNtbOSwXfGhzkwkvBK1TdyLqBsFPCRj04XkL3uKMv6Orn7TYX4Rlbij')>,
'host': '127.0.0.1:8899',
'id': UUID('1e980044-e868-4e90-ac9c-d76cdbb3fbf1'),
'ip': '127.0.0.1',
'json': None,
'load_json': <bound method Request.load_json of <Request: GET /cc>>,
'match_info': {},
'method': 'GET',
'name': 'test.cc', # test是Sanic(name='test') cc是访问路径
'parsed_accept': ['text/html', 'application/xhtml+xml', 'image/avif', 'image/webp', 'image/apng', 'application/signed-exchange;v=b3;q=0.9', 'application/xml;q=0.9', '*/*;q=0.8'],
'parsed_args': defaultdict(<class 'sanic.request.RequestParameters'>, {(False, False, 'utf-8', 'replace'): {'p': ['pp']}}),
'parsed_credentials': None,
'parsed_files': {},
'parsed_form': {},
'parsed_forwarded': {}, 'parsed_json': None,
'parsed_not_grouped_args': defaultdict(<class 'list'>, {(False, False, 'utf-8', 'replace'): [('p', 'pp')]}),
'parsed_token': None,
'path': '/cc',
'port': 56221,
'protocol': <sanic.server.protocols.http_protocol.HttpProtocol object at 0x10ab33310>,
'query_args': [('p', 'pp')],
'query_string': 'p=pp',
'raw_headers': b'Host: 127.0.0.1:8899\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nsec-ch-ua: " Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"\r\nsec-ch-ua-mobile: ?0\r\nsec-ch-ua-platform: "macOS"\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nSec-Fetch-Site: none\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-User: ?1\r\nSec-Fetch-Dest: document\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9,zh-TW;q=0.8\r\nCookie: csrftoken=1I4Acx73SpNtbOSwXfGhzkwkvBK1TdyLqBsFPCRj04XkL3uKMv6Orn7TYX4Rlbij',
'raw_url': b'/cc?p=pp',
'receive_body': <bound method Request.receive_body of <Request: GET /cc>>,
'remote_addr': '',
'request_line': b'GET /cc?p=pp HTTP/1.1',
'request_middleware_started': True,
'reset_response': <bound method Request.reset_response of <Request: GET /cc>>,
'respond': <bound method Request.respond of <Request: GET /cc>>,
'responded': False,
'route': <Route: name=test.cc path=cc>,
'scheme': 'http',
'server_name': '127.0.0.1',
'server_path': '/cc',
'server_port': 8899,
'socket': ('127.0.0.1', 56221),
'stream': <sanic.http.Http object at 0x10ab605f0>,
'token': None,
'transport': <TCPTransport closed=False reading=True 0x7fd3dbc04ad0>,
'uri_template': '/cc',
'url': 'http://127.0.0.1:8899/cc?p=pp',
'url_for': <bound method Request.url_for of <Request: GET /cc>>,
'version': '1.1'
}
获取token
使用postman测试访问
# 这个会被 request.token捕获
Authorization:Bearer [Token JWT]
# 需要自己在headers里捕获
# request.headers.get('x-refresh-token').replace('Bearer ', '')
X-Refresh-Token:Bearer [Refresh-Token JWT]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界