Захоплення параметрів URL у запиті.GET


457

Наразі я визначаю регулярні вирази для того, щоб фіксувати параметри в URL-адресі, як описано в навчальному посібнику. Як я можу отримати доступ до параметрів з URL-адреси як частини HttpRequestоб'єкта? HttpRequest.GETНаразі мій повертає порожній QueryDictоб’єкт.

Я хотів би навчитися робити це без бібліотеки, щоб я міг краще познайомитися з Джанго.

Відповіді:


659

Коли 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

10
Є "? Param =" єдиний спосіб, як Джанго розпізнає параметри? Чи є спосіб використовувати URLconf з HTTP.GET? Я хотів би зробити / param / 2.
sutee

3
Перегляньте другу частину моєї відповіді щодо ваших URL-адрес зйомки та регексу.
camflan

2
Нема проблем. використовуйте request.GET, якщо ви надсилаєте форму за допомогою GET, використовуйте request.POST, якщо ви надсилаєте форму за допомогою POST, і якщо ви просто хочете налаштувати URL-адреси для змінних розділів, то це аргумент URLconf / view.
camflan

10
Що з представленнями на основі класу?
Користувач

8
для переглядів на основі класу, які ви можете використовуватиself.kwargs['parameter']
Royendgel Silberie

335

Щоб уточнити пояснення Камфлана, припустимо, що у вас є

  • правило url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
  • a у вхідному запиті для http://domain/user/thaiyoshi/?message=Hi

Правило диспетчера URL буде захоплювати частини URL- шляху (тут "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-адрес, не використовуйте ідентифікаційні номери та не використовуйте, наприклад, дати, категорії та / або смоли: /blog/post/2008/09/30/django-urls/

17
Це дійсно добре написана відповідь. Це точно допомогло мені трохи краще зрозуміти Джанго.
Марк

2
як ми можемо отримати всі значення параметрів, не згадуючи імен
numrah

@numerah request.GET - словник Python. Ви можете, наприклад, ітератувати через request.GET.items ().
akaihola

ідеальна відповідь.
Jay Geeth

1
будь-які причини, чому вважається за краще дотримуватися звичок, записаних у оновленнях? (коли використовувати URL-шлях до параметри GET)
m0etaz

55

Використання GET

request.GET["id"]

Використання POST

request.POST["id"]

27
Хоча це працює для існуючих ключів, відповіді camflan та akaihola використовували .get (), щоб уникнути KeyErrorвинятків у випадку відсутності ключа. Було б розумно зробити те саме (наприклад request.POST.get('id', '')).
надзвичайно суперіормен



20

Я хотів би додати тут якийсь варіант себе. Хтось задається питанням, як встановити шлях у urls.py, наприклад,

domain/search/?q=CA

щоб ми могли викликати запит.

Справа в тому, що НЕ потрібно встановлювати такий маршрут у urls.py. Вам потрібно встановити лише маршрут у urls.py

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

і коли ви вводите HTTP: // ім'я_сервера: порт / домен / пошук / д = 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"

Привіт Еріку! Я новачок у Джанго. Чи можете ви пролити більше світла на "queryset = queryset.filter (state__name = state_name)". Що означає подвійний підкреслення в імені state__name.
суббу

1
Тут "стан" - це таблиця, а "ім'я" - подана в цю таблицю. У фільтрі Django state__name посилатиметься на значення поля "name" у таблиці "state".
Ерік Ендрюс

цей працював порівняно з іншими.
Сібіш

17

Я хотів би поділитися порадою, яка може заощадити ваш час.
Якщо ви плануєте використовувати щось подібне у своєму urls.pyфайлі:

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

Що в основному означає www.example.com/<username>. Не забудьте розмістити його в кінці своїх записів URL-адреси, оскільки в іншому випадку це схильне викликати конфлікти із записами URL-адрес, які випливають нижче, тобто доступ до однієї з них призведе до вашої приємної помилки: User matching query does not exist.

я щойно пережив це; сподіваюся, що це допоможе!


2
Крім того, у цьому випадку ви можете переконатися, що імена користувачів не стикаються з іншими адресами URL-адрес.
DrKaoliN

13

У вас є два поширених способи зробити це у випадку, якщо ваша URL-адреса виглядає так:

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

v1:

Якщо конкретний ключ є обов'язковим, ви можете використовувати:

key_a = request.GET['a']

Це поверне значення, aякщо ключ існує, а виняток - якщо ні.

v2:

Якщо ваші ключі необов’язкові:

request.GET.get('a')

Ви можете спробувати, що без жодних аргументів це не вийде з ладу. Таким чином, ви можете обернути його try: except:і повернутися HttpResponseBadRequest()в приклад. Це простий спосіб зробити ваш код менш складним, не використовуючи спеціальних операцій з винятками.


як я можу виявити параметр запиту з шаблону?
Акін Хван


5

Наразі ці запити виконуються двома способами. Якщо ви хочете отримати доступ до параметрів запиту (GET), ви можете здійснити запит на наступне:

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

Якщо ви хочете отримати доступ до параметрів, переданих POST, вам потрібно отримати доступ таким чином:

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

Доступ до словника (QueryDict) за допомогою "get ()", ви можете встановити значення за замовчуванням. У вищезазначених випадках, якщо "статус" або "роль" не повідомляються, значення не мають значення.


0

Це ще одне альтернативне рішення, яке можна реалізувати:

у конфігурації URL. :

urlpatterns = [path('runreport/<str:queryparams>', views.get)]

у видах:

list2 = queryparams.split("&")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.