2015-07-21 19 views
8

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?

Trả lời

2

Điều này giống như một lỗi trong DRF đã được sửa. Như bạn có thể thấy here, họ đã thay đổi mã để nó chỉ cuộn lại khi ở trong một khối nguyên tử.

Vì không có phiên bản mới hơn được xuất bản, bạn có thể áp dụng cùng một sửa chữa cho mã đã cài đặt của bạn hoặc sử dụng phiên bản cũ hơn cho đến khi 3.1.3 được thay thế.

+0

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! –

Các vấn đề liên quan