web-dev-qa-db-ja.com

Request.GETでURLパラメータを取得する

チュートリアルで説明されているように、URL内のパラメータを取得するために現在正規表現を定義しています。 HttpRequestオブジェクトの一部としてURLからパラメータにアクセスするにはどうすればよいですか?私のHttpRequest.GETは現在空のQueryDictオブジェクトを返します。

ライブラリを使わずにこれを行う方法を学びたいので、Djangoをよりよく知ることができます。

389
sutee

urlが以下のような場合:domain/search/?q=haha、そしてrequest.GET.get('q', '')を使います。

qは必要なパラメータです。そしてqが見つからない場合は''がデフォルト値です。

ただし、代わりにURLconfを設定するだけの場合は、regexからのキャプチャは引数(または名前付き引数)として関数に渡されます。

といった:

(r'^user/(?P<username>\w{0,50})/$', views.profile_page,),

それであなたのviews.pyには

def profile_page(request, username):
    # Rest of the method
572
camflan

Camflanの説明を明確にするために、あなたが持っているとしましょう。

  • ルールurl(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
  • http://domain/user/thaiyoshi/?message=Hiに対する着信要求

URLディスパッチャルールはURL path (ここでは"user/thaiyoshi/")の一部をキャッチし、それらをリクエストオブジェクトと共にview関数に渡します。

クエリ文字列(ここでは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/
304
akaihola

GETを使う

request.GET["id"]

POSTを使う

request.POST["id"]
46
Dadaso Zanzane
def some_view(request, *args, **kwargs):
    if kwargs.get('q', None):
        # Do something here ..
20
Kevin

時間を節約するためのヒントを共有したいと思います。
urls.pyファイルで次のようなものを使用する場合:

url(r'^(?P<username>\w+)/$', views.profile_page,),

これは基本的にwww.example.com/<username>を意味します。 URLエントリの最後に配置するようにしてください。そうしないと、以下のURLエントリと競合する傾向があります。つまり、いずれかにアクセスするとwill Niceエラーが発生します:User matching query does not exist.

自分でそれを体験しました。それが役に立てば幸い!

17
DrKaoliN

あなたのURLがそのように見える場合のためにそれをする2つの一般的な方法があります:

https://domain/method/?a=x&b=y

v1:

特定のキーが必須の場合は、次のものを使用できます。

key_a = request.GET['a']

Keyが存在する場合はaの値を返し、存在しない場合はExceptionを返します。

v2:

キーがオプションの場合

request.GET.get('a')

何の引数もなくてもこれを試すことができます。これはクラッシュしません。それで、あなたはそれをtry: except:でラップして、そして例でHttpResponseBadRequest()を返すことができます。これは、特別な例外処理を使用せずにコードを複雑にしないための簡単な方法です。

10

requestオブジェクトしかない場合は、request.parser_context['kwargs']['your_param']を使用できます。

10

これはまさにあなたが求めたものではありませんが、 このスニペットtemplatesquery_stringsを管理するのに役立ちます。

8
jamting

ここに私自身のオプションをいくつか追加したいのですが。次のように、urls.pyでパスを設定する方法を誰かが疑問に思うでしょう。

domain/search/?q=CA

クエリを起動できるように.

実際、urls.pyでそのような経路を設定する必要はありません。あなたが設定する必要があるのはurls.pyの単なるルートです

urlpatterns = [
    path('domain/search/', views.CityListView.as_view()),
]

また、 http://サーバー名:ポート/ドメイン/ 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"
4
Eric Andrews

現在、これらのクエリは2つの方法で実行されます。クエリパラメータ(GET)にアクセスする場合は、次のクエリを実行できます。

http://myserver:port/resource/?status=1
request.query_params.get('status', None) => 1

POSTによって渡されたパラメーターにアクセスする場合は、次の方法でアクセスする必要があります。

request.data.get('role', None)

'get()'で辞書(QueryDict)にアクセスすると、デフォルト値を設定できます。上記の場合、「status」または「role」が通知されない場合、値はNoneです。

0
mdcg