Tôi đang sử dụng Django==1.9.2
và djangorestframework==3.3.2
và django.test.Client
để thực hiện một số thử nghiệm. Vấn đề là khi tôi thực hiện các bài kiểm tra của tôi, tôi đang gettting lỗi này:Kiểm tra Django 1.9.2 Vấn đề của khách hàng
ERROR: test_view (main.tests.test_http.TestMainViewSet)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/vladir/work/all/project-django1.9/saxo-publish/publish/main/tests/test_http.py", line 111, in test_view
content_type='application/json'
File "/home/vladir/work/all/project-django1.9/venv/local/lib/python2.7/site-packages/django/test/client.py", line 515, in post
secure=secure, **extra)
File "/home/vladir/work/all/project-django1.9/venv/local/lib/python2.7/site-packages/django/test/client.py", line 314, in post
secure=secure, **extra)
File "/home/vladir/work/all/project-django1.9/venv/local/lib/python2.7/site-packages/django/test/client.py", line 380, in generic
return self.request(**r)
File "/home/vladir/work/all/project-django1.9/venv/local/lib/python2.7/site-packages/django/test/client.py", line 449, in request
response = self.handler(environ)
File "/home/vladir/work/all/project-django1.9/venv/local/lib/python2.7/site-packages/django/test/client.py", line 123, in __call__
response = self.get_response(request)
File "/home/vladir/work/all/project-django1.9/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 245, in get_response
response = self.handle_uncaught_exception(request, resolver, sys.exc_info())
File "/home/vladir/work/all/project-django1.9/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 296, in handle_uncaught_exception
return callback(request, **param_dict)
File "/home/vladir/work/all/project-django1.9/venv/local/lib/python2.7/site-packages/django/utils/decorators.py", line 166, in _wrapped_view
return middleware.process_response(request, response)
File "/home/vladir/work/all/project-django1.9/venv/local/lib/python2.7/site-packages/django/middleware/csrf.py", line 230, in process_response
request.META["CSRF_COOKIE"],
KeyError: u'CSRF_COOKIE'
mã kiểm tra của tôi trông như thế này:
import json
from django.test import Client
from django.core.urlresolvers import reverse
from django.contrib.auth.models import User
class TestMainViewSet(TestCase):
def setUp(self):
self.client = Client(
HTTP_HOST='example.com' # I have also tried removing this
)
self.create_read_url = reverse('books-list')
User.objects.create_user(
username="username",
email="[email protected]",
password="123"
)
def test_create(self):
self.client.login(username='username', password="123")
# In this case I'm doing a POST, but it is the same with a GET
response = self.client.post(
self.create_read_url,
data=json.dumps({'title': "Create"}), # I have also tried without the json.dumps
content_type='application/json'
)
data = json.loads(response.content)
print data
self.assertEqual(response.status_code, 201)
self.assertEquals(data['title'], "Create")
đang view
của tôi là:
from django.contrib.auth.mixins import LoginRequiredMixin
from rest_framework import viewsets
from .serialiazers import (
BookSerializerRead,
BookSerializerWrite,
)
class MainViewSet(LoginRequiredMixin, viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class_read = BookSerializerRead
serializer_class_write = BookSerializerWrite
trên số urls.py
:
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'books', MainViewSet, 'books')
urlpatterns = [
url(r'^api/', include(router.urls)),
]
Theo số Django doc về điều đó, tôi không cần thêm bất kỳ thứ gì để tránh CSRF checks
, vì như đã nói ở đây: "Theo mặc định, ứng dụng khách sẽ vô hiệu hóa bất kỳ kiểm tra CSRF nào do trang web của bạn thực hiện." rằng enforce_csrf_checks=False
theo mặc định trên Client
.
Tôi đã tìm thấy một chi tiết mặc dù, nếu tôi tạo một cá thể của khách hàng theo cách đó self.client = Client(HTTP_HOST='example.com', CSRF_COOKIE='xxxxxx')
thì nó hoạt động, nhưng đó có phải là thực sự cần thiết không? Nó không phải là những gì tài liệu nói, vì vậy tôi cho rằng tôi đang làm điều gì đó sai trái. Ai đó có thể giúp tôi với điều đó được không? Tôi sẽ đánh giá cao bất kỳ sự giúp đỡ nào. Cảm ơn trước
DRF cung cấp cơ chế kiểm tra khác nhau, bạn có thể muốn thử những: http: //www.django-rest-framework .org/api-guide/testing/ –
Cảm ơn đề xuất của bạn @TomCarrick, rất hữu ích, tôi chưa từng sử dụng nó trước đây. Tôi sẽ kiểm tra điều này, chắc chắn. Câu hỏi chính của tôi là những gì đã thay đổi từ 'Django 1.8.4' thành' Django 1.9.2' đã phá vỡ điều này? Và theo quan điểm của tôi, nó liên quan đến chính bản thân Django, cuối cùng nó là một yêu cầu như 'json' đến một điểm cuối' Django Rest Framework', nó nên có tác dụng, tôi nghĩ :(. –