Tôi đã cập nhật dự án bằng cách sử dụng khung REST Django từ phiên bản 2.x đến phiên bản ổn định cuối cùng (3.1.3). Sau khi sửa chữa một số sử dụng không được chấp nhận trong serializers của tôi, tôi chạy python manage.py test
để đảm bảo không có gì bị hỏng.Lỗi giao dịch khi khung Django REST nêu ra lỗi về mục đích
Mọi thứ hoạt động tốt ngoại trừ một số thử nghiệm của tôi, nơi tôi đang thử nghiệm các yêu cầu REST không hợp lệ (có chủ đích). Ví dụ:
def test_get_events_of_other_user(self):
# Assume the setUp log the user1 with self.client
# and here, there is some code initializing an
# event for user2
response = self.client.get("/event/123/")
self.assertEqual(404, response.status_code)
Các viewset tạo ra một ORM-truy vấn như MyEventModel.objects.get(user=request.user, pk=123)
, mà rõ ràng là đặt ra một ngoại lệ 404 trong DRF, vì không có đối tượng nên được trả lại đây (Tôi biết, nó phải là một 403 để thể yên -compliant ...). Nhưng điều này làm nảy sinh một TransactionManagementError
:
Traceback (most recent call last):
[...]
File "/my_virtual_env_path/local/lib/python2.7/site-packages/rest_framework/viewsets.py", line 85, in view
return self.dispatch(request, *args, **kwargs)
File "/my_virtual_env_path/local/lib/python2.7/site-packages/rest_framework/views.py", line 456, in dispatch
response = self.handle_exception(exc)
File "/my_virtual_env_path/local/lib/python2.7/site-packages/rest_framework/views.py", line 421, in handle_exception
response = exception_handler(exc, context)
File "/my_virtual_env_path/local/lib/python2.7/site-packages/rest_framework/views.py", line 81, in exception_handler
set_rollback()
File "/my_virtual_env_path/local/lib/python2.7/site-packages/rest_framework/compat.py", line 277, in set_rollback
transaction.set_rollback(True)
File "/my_virtual_env_path/local/lib/python2.7/site-packages/django/db/transaction.py", line 215, in set_rollback
return get_connection(using).set_rollback(rollback)
File "/my_virtual_env_path/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 372, in set_rollback
"The rollback flag doesn't work outside of an 'atomic' block.")
TransactionManagementError: The rollback flag doesn't work outside of an 'atomic' block.
Dường như một trong những trung gian của tôi đang làm một số truy vấn SQL sau khi xem, và nhấn transaction closed by DRF, since the 3.1.3. Hành vi mong muốn (tức là nhận được 404 NOT FOUND) hoạt động với 3.1.2 ...
Có ai có ý tưởng về cách tôi có thể tránh khôi phục không? Có một quan niệm sai lầm trong DRF?
Thực vậy, nó hoạt động với bản sửa lỗi này. Tôi sẽ tiếp tục sử dụng bản phát hành 3.1.2 cho đến khi phiên bản 3.1.4 hết. Cảm ơn các liên kết! –