前回の記事ではフロントエンド認証に関する内容を記録しましたが、このnoteではHTTPのリクエストメッセージ解析、fastapiのCookieやパラメータの設定、fastapiのリクエストヘッダパラメータの設定など、リクエストヘッダに関する内容を中心に記録します。
HTTPリクエスト
HTTP リクエスト メッセージは、リクエスト行、リクエスト ヘッダー、リクエスト本文の 3 つの部分に分かれています。
リクエストライン
リクエスト ラインには、リクエスト メソッド、リクエスト アドレス、プロトコル バージョンの 3 つの部分があり、通常、リクエストはリクエスト ラインを通じて送信されます。
リクエストヘッダー
リクエスト ヘッダーは通常、キーと値のペアである多数の属性で構成されており、サーバーはリクエスト ヘッダーを通じてクライアントの基本情報を取得します。
リクエストボディ
リクエスト本文は、クライアントからサーバーに送信されるデータであることは誰もがよく知っています。
クッキーパラメータ
前述のパス パラメーターとクエリ パラメーターの設定と同様に、fastapi のメソッドを使用して cookie パラメーターを定義できます。
ただし、Cookie パラメーターを定義する前に、Cookie パラメーターをテストする必要があります。前の章で、Cookie がサーバーによってフロントエンドに応答されることがわかっているため、最初に Cookie をフロントエンドに送信する必要があります。
@app05.get("/stu05/setcookie")
def get_setcookie(response:Response):
response.set_cookie("cookie1","cookie111111111111")
response.set_cookie("cookie2","cookie222222222222")
response.set_cookie("cookie3", "cookie333333333333")
return {
"result":"设置cookie成功"}
ここでは、fastapi のレスポンスメソッドを使用して set_cookie をフロントエンドに送信します. フロントエンドがレスポンスを受信した後、クッキーが存在します. 具体的な動作と詳細なアプリケーションについては、後の章で詳しく説明します.これは主に、受信した Cookie パラメータをテストするためです。
次に、ランダムにリンクにアクセスし、デフォルトで hello world を作成しましょう。Cookie がすでに存在していることがわかります。
Cookieパラメータを定義する
@app05.get("/stu05/getcookie")
def stu05_read_cookie(
cookie1:Optional[str] = Cookie(None),
cookie2:Optional[str] = Cookie(None)
):
return {
"cookie1":cookie1,"cookie2":cookie2} # 定义Cookie参数需要使用Cookie类,否则就是查询参数
Cookie を使用すると、fastapi メソッドを通じて Cookie パラメータを受け取り、Cookie で Cookie パラメータを宣言し、受け取った Cookie パラメータを返すことができます。すでに Cookie があるため、API ドキュメントで直接テストすることで、リクエストが完了したことがわかります。
ヘッダーパラメータ
その前に、ヘッダーとヘッダーの違いを簡単に理解しましょう。
ヘッダは、リクエストまたはレスポンスのヘッダ部分であるボディに相当し、CRLFで区切られた複数行のテキスト行である。
ヘッダーの後に CRLF が 2 つ続き、それ以降がボディとなりますが、通常、GET にはボディがありません。
ヘッダーは、ヘッダー段落内の複数行のテキストを指します。headers はヘッダー内のコンテンツです。
@app05.get("/stu05/getheader")
def stu05_read_header(
user_agent:Optional[str] = Header(None)
):
return {
"User-agent":user_agent}
他のパラメータと同様に、fastapi の Header クラスを使用して Header パラメータを宣言できます。上記の user_agent は Header パラメータです。Header クラスの宣言なしでクエリ パラメータとしても解析されます。
自動変換
ほとんどの標準ヘッダーは'-'
「ハイフン」、つまりマイナス記号で区切られています (例: ) がuser-agent
、そのような変数は Python では無効です。そのため、Python でパラメータを定義する際にまったく同じ記述方法を使用することはできませんが、この場合、FastAPI はデフォルトHeader
でパラメータ名の文字をアンダースコア ( _
) からハイフン ( -
) に変換して抽出して記録しますheaders
。
同時に、HTTP headers
大文字と小文字が区別されないため、標準の Python スタイルを使用して宣言できます。つまり、最初の文字を大文字user_agent
にする必要がなく、 Python コードで通常どおり使用できます。User_Agent
convert_underscores=False
もちろん、FastAPI はアンダースコア変換を無効にする機能も提供します。つまり、次のように対応するパラメータで設定できますが、一部の HTTP プロキシおよびサーバーではアンダースコアの使用が許可されていないheaders
ため、アンダースコア変換が無効になる状況が発生する可能性があります。情報を受信できないため、デフォルトはTrue
can です。
user_agent:Optional[str] = Header(None,convert_underscores=False)
ヘッダーの重複
実際には、重複したヘッダーを受信する可能性は十分にあります。つまり、同じヘッダーの下のパラメーターには複数の値があります。
この場合、型宣言で直接リストを使用してこれらのケースを定義します。
@app05.get("/stu05/getheaders")
def stu05_read_headers(
paramlist:Optional[List[str]] = Header(None)
):
return {
"paramlist":paramlist}
上記のコードは
List
型Header
パラメータを宣言しており、Postman は次のように繰り返されるヘッダーの意味をより直接的に表示できます。
ソースコード
# -*- coding: utf-8 -*-
# @Time: 2022/11/28 18:27
# @Author: MinChess
# @File: stu05.py
# @Software: PyCharm
from fastapi import APIRouter,Response,Cookie,Header
from pydantic import BaseModel
from typing import Optional,List
app05 = APIRouter()
@app05.get("/stu05/setcookie")
def get_setcookie(response:Response):
response.set_cookie("cookie1","cookie111111111111")
response.set_cookie("cookie2","cookie222222222222")
response.set_cookie("cookie3", "cookie333333333333")
return {
"result":"设置cookie成功"}
@app05.get("/stu05/getcookie")
def stu05_read_cookie(
cookie1:Optional[str] = Cookie(None),
cookie2:Optional[str] = Cookie(None)
):
'''
:param cookie1:
:param cookie2:
:return:
'''
return {
"cookie1":cookie1,"cookie2":cookie2} # 定义Cookie参数需要使用Cookie类,否则就是查询参数
@app05.get("/stu05/getheader")
def stu05_read_header(
user_agent:Optional[str] = Header(None)
):
return {
"User-agent":user_agent}
@app05.get("/stu05/getheaders")
def stu05_read_headers(
paramlist:Optional[List[str]] = Header(None)
):
return {
"paramlist":paramlist}
読んでくれてありがとう!
ブログリンク:入門から実戦までのFastAPI (9) - CookieとHeaderパラメータの設定