request.GETでURLパラメーターをキャプチャする
質問
現在、チュートリアルで説明されているように、URLのパラメーターをキャプチャするために正規表現を定義しています。 HttpRequest
オブジェクトの一部としてURLからパラメーターにアクセスするにはどうすればよいですか?現在、私のHttpRequest.GET
は空のQueryDict
オブジェクトを返します。
ライブラリを使用せずにこれを行う方法を学びたいので、Djangoをよりよく知ることができます。
解決
URLが次のような場合:domain/search/?q=haha
、
次に、request.GET.get('q', '')
を使用します。
q
は必要なパラメーターで、''
が見つからない場合はURLconf
がデフォルト値です。
ただし、代わりにregex
を設定するだけの場合、views.py
からのキャプチャは引数(または名前付き引数)として関数に渡されます。
例:
(r'^user/(?P<username>\w{0,50})/$', views.profile_page,),
その後、あなたの<=>にあなたはいるでしょう
def profile_page(request, username):
# Rest of the method
他のヒント
camflanの説明を明確にするために、あなたが持っていると仮定しましょう
- ルール
url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
- a
http://domain/user/thaiyoshi/?message=Hi
への着信リクエスト
URLディスパッチャルールは、URL path (ここでは"user/thaiyoshi/"
)の一部をキャッチし、それらをリクエストオブジェクトとともにビュー関数に渡します。
クエリ文字列(ここではmessage=Hi
)が解析され、パラメーターはQueryDict
にrequest.GET
として保存されます。 HTTP GETパラメーターのそれ以上のマッチングまたは処理は行われません。
このビュー関数は、URLパスから抽出された部分とクエリパラメーターの両方を使用します。
def profile_page(request, username=None):
user = User.objects.get(username=username)
message = request.GET.get('message')
補足説明として、"GET"
にはリクエストメソッド(この場合は"POST"
、通常は送信済みフォームの場合はrequest.method
)があります。場合によっては、期待しているものと一致することを確認すると便利です。
更新:情報の受け渡しにURLパスを使用するかクエリパラメーターを使用するかを決定する場合、以下が役立つ場合があります。
- リソースを一意に識別するためにURLパスを使用します。
/blog/post/15/
(/blog/posts/?id=15
ではない) - クエリパラメータを使用して、リソースの表示方法を変更します。
/blog/post/15/?show_comments=1
または/blog/posts/2008/?sort_by=date&direction=desc
- 人間に優しいURLを作成するには、ID番号の使用を避け、日付、カテゴリ、スラッグ:
/blog/post/2008/09/30/django-urls/
GETの使用
request.GET["id"]
POSTの使用
request.POST["id"]
def some_view(request, *args, **kwargs):
if kwargs.get('q', None):
# Do something here ..
時間を節約できるヒントを共有したい。
urls.py
ファイルで次のようなものを使用する場合:
url(r'^(?P<username>\w+)/
基本的には
www.example.com/<username>
を意味します。 URLエントリの最後に配置してください。そうしないと、以下のURLエントリと競合する傾向があります。つまり、いずれかにアクセスすると エラーが発生します。< code>ユーザーマッチングクエリが存在しません。
私は自分でそれを体験しました。役に立てば幸いです!, views.profile_page,),
基本的には www.example.com/<username>
を意味します。 URLエントリの最後に配置してください。そうしないと、以下のURLエントリと競合する傾向があります。つまり、いずれかにアクセスすると エラーが発生します。< code>ユーザーマッチングクエリが存在しません。
私は自分でそれを体験しました。役に立てば幸いです!
request
オブジェクトのみがある状況では、 request.parser_context ['kwargs'] ['your_param']
URLが次のようになっている場合、2つの一般的な方法があります。
https://domain/method/?a=x&b=y
v1:
特定のキーが必須の場合は、次を使用できます:
key_a = request.GET['a']
キーが存在する場合は a
の値を返し、存在しない場合は例外を返します。
v2:
キーがオプションの場合:
request.GET.get('a')
引数なしでこれを試すことができますが、これはクラッシュしません。
したがって、例では try:except:
でラップし、 HttpResponseBadRequest()
を返すことができます。
これは、特別な例外処理を使用せずに、コードを単純にする簡単な方法です。
これはまさにあなたが求めたものではありませんが、このスニペットは管理に役立ちます< templates
のcode> query_strings 。
ここで、自分自身のオプションをいくつか追加したいと思います。
など、urls.pyでパスを設定する方法を知りたい人がいます。domain/search/?q=CA
クエリを呼び出すことができます。
事実、urls.pyにそのようなルートを設定する必要はありません。設定する必要があるのは、urls.pyのルートだけです
urlpatterns = [
path('domain/search/', views.CityListView.as_view()),
]
および http:// servername:port / domain / search /?q =を入力するとCA 。クエリパーツ '?q = CA'は、参照できるハッシュテーブルに自動的に予約されます
request.GET.get('q', None).
例を示します(views.py)
class CityListView(generics.ListAPIView):
serializer_class = CityNameSerializer
def get_queryset(self):
if self.request.method == 'GET':
queryset = City.objects.all()
state_name = self.request.GET.get('q', None)
if state_name is not None:
queryset = queryset.filter(state__name=state_name)
return queryset
さらに、URLにクエリ文字列を記述する場合
http://servername:port/domain/search/?q=CA
クエリ文字列を引用符で囲まないでください。例:
http://servername:port/domain/search/?q="CA"