request.get에서 URL 매개 변수를 캡처합니다
문제
현재 자습서에 설명 된대로 URL에서 매개 변수를 캡처하기 위해 정규식을 정의하고 있습니다. URL에서 매개 변수에 액세스하는 방법은 HttpRequest
물체? 나의 HttpRequest.GET
현재 빈을 반환합니다 QueryDict
물체.
Django를 더 잘 알 수 있도록 도서관 없이이 작업을 수행하는 방법을 배우고 싶습니다.
해결책
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
다른 팁
Camflan의 설명을 명확히하기 위해
- 규칙
url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
- 수신 요청에 대한
http://domain/user/thaiyoshi/?message=Hi
URL 디스패처 규칙은 URL의 일부를 잡을 것입니다. 길 (여기 "user/thaiyoshi/"
) 그리고 요청 객체와 함께보기 함수로 전달하십시오.
쿼리 문자열 (여기 message=Hi
)는 구문 분석되고 매개 변수는 a로 저장됩니다 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"]
게시물 사용
request.POST["id"]
def some_view(request, *args, **kwargs):
if kwargs.get('q', None):
# Do something here ..
시간을 절약 할 수있는 팁을 공유하고 싶습니다.
당신이 당신의 urls.py
파일:
url(r'^(?P<username>\w+)/$', views.profile_page,),
기본적으로 의미합니다 www.example.com/<username>
. URL 항목 끝에 배치하십시오. 그렇지 않으면 아래에 다음과 같은 URL 항목과 충돌이 발생하기 쉽기 때문에 그 중 하나에 액세스하기 쉽기 때문입니다. ~ 할 것이다 좋은 오류를 제공하십시오. User matching query does not exist.
방금 직접 경험했습니다. 도움이되기를 바랍니다!
당신이있는 상황에 대해 request
당신이 사용할 수있는 객체 request.parser_context['kwargs']['your_param']
URL이 다음과 같이 보일 경우이를 수행하는 두 가지 일반적인 방법이 있습니다.
https://domain/method/?a=x&b=y
v1 :
특정 키가 필수 인 경우 다음을 사용할 수 있습니다.
key_a = request.GET['a']
이것은 값을 반환합니다 a
키가 존재하고 예외가 아닌 경우.
v2 :
키가 선택 사항 인 경우 :
request.GET.get('a')
논쟁없이 시도해 볼 수 있습니다. 이것은 충돌하지 않을 것입니다. 그래서 당신은 그것을 포장 할 수 있습니다 try: except:
그리고 반환 HttpResponseBadRequest()
예를 들어. 이것은 특별한 예외 처리를 사용하지 않고 코드를 덜 복잡하게 만드는 간단한 방법입니다.
이것은 정확히 당신이 요청한 것이 아니라 이 스 니펫 관리에 도움이됩니다 query_strings
안에 templates
.
여기에 나 자신의 옵션을 추가하고 싶습니다. 누군가는 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"