我想在我的Django项目中使用Python type hints。在Django中注解简单class-based view的get/post方法的正确方法是什么?我已经搜索了Django代码本身,但它似乎不包含任何类型提示。
get
post
7rtdyuoh1#
Django stubs是一个维护良好的包,https://github.com/typeddjango/django-stubs。
import typing as t from django.http import HttpResponseRedirect from django.shortcuts import render from django.views import View from django.http import HttpRequest, HttpResponse, JsonResponse, HttpResponseRedirect from .forms import MyForm # type alias when response is one of these types RedirectOrResponse = t.Union[HttpResponseRedirect, HttpResponse] class MyFormView(View): form_class = MyForm initial = {'key': 'value'} template_name = 'form_template.html' def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: form = self.form_class(initial=self.initial) return render(request, self.template_name, {'form': form}) def post(self, request: HttpRequest, *args: tuple[Any], **kwargs: dict[str, t.Union[int, str]]) -> RedirectOrResponse: form: MyForm = self.form_class(request.POST) if form.is_valid(): # <process form cleaned data> return HttpResponseRedirect('/success/') return render(request, self.template_name, {'form': form})
HttpRequest
HttpResponse, JsonResponse, StreamingResponse, Redirect
*args, **kwargs
*args: Any
*args: tuple[Any]
type[cls]
更多示例:https://github.com/typeddjango/django-stubs/tree/master/tests
kpbwa7wx2#
只需使用typing(如果需要)并像平常一样键入提示即可。示例:
def get(self, request: HttpRequest, question_id: typing.Optional[str] = None) -> HttpResponse: # code here
存在您可能感兴趣的存储库:https://github.com/machinalis/mypy-django这样你就可以像这样使用注解:
def get(self, request: HttpRequest, question_id: str) -> HttpResponse:
pbwdgjma3#
如果您使用基于函数的视图,并且不需要mypy-django,您可以:
from django.http import HttpRequest, HttpResponse, JsonResponse def some_fbv(request: HttpRequest) -> HttpResponse: .... return foo def some_json_producing_fbv(request: HttpRequest) -> JsonResponse: ... return foo
3条答案
按热度按时间7rtdyuoh1#
Django stubs是一个维护良好的包,https://github.com/typeddjango/django-stubs。
HttpRequest
Map到函数或方法中的请求变量。HttpResponse, JsonResponse, StreamingResponse, Redirect
将是视图函数/方法返回的值。*args, **kwargs
既简单又复杂,因为它可以是 * 任意 * 元组值或字典值。*args: Any
或*args: tuple[Any]
(如果您知道,也可以使用特定类型)。type[cls]
。更多示例:https://github.com/typeddjango/django-stubs/tree/master/tests
kpbwa7wx2#
只需使用typing(如果需要)并像平常一样键入提示即可。
示例:
存在您可能感兴趣的存储库:https://github.com/machinalis/mypy-django
这样你就可以像这样使用注解:
pbwdgjma3#
如果您使用基于函数的视图,并且不需要mypy-django,您可以: