2010-09-01 24 views
6

tôi có một cái nhìn trông như thế này:Làm cách nào để kiểm tra ngữ cảnh và phiên trong Django sau khi chuyển hướng?

def login(request): 
    ... 
    # some variables has been set here 
    ... 
    if request.POST.get('remember_me', None): 
     request.session.set_expiry(1209600) # 2 weeks 
    return HttpResponseRedirect(reverse('dashboard')) 

Bây giờ Nếu tôi khẳng định cho các biến sử dụng bối cảnh, tôi nhận được lỗi: "AttributeError: 'HttpResponseRedirect' đối tượng không có thuộc tính 'bối cảnh'" đây là tương tự cho các phiên. Làm thế nào để kiểm tra nó sau đó rằng một số biến đã được thiết lập và có thể hết hạn phiên đã được thiết lập ngay cả khi tôi chuyển hướng?

Trả lời

5

Bạn không thể truy xuất biến ngữ cảnh từ HttpResponseRedirect. Nó không có ý nghĩa tại sao bạn đang thiết lập các biến ngữ cảnh nếu bạn đang chuyển hướng anyway.

Bạn chắc chắn sẽ có thể nhận các biến từ phiên sau khi chuyển hướng. Tôi đã làm điều này trong một số trường hợp thử nghiệm của tôi. Bạn xác nhận dữ liệu phiên trong trường hợp thử nghiệm của mình như thế nào?

Đây là cách tôi đi về khẳng định các biến session sau khi chuyển hướng:

response = self.client.post(reverse('foo')) 
self.assertRedirects(response, reverse('bar', args = ['baz']), 
     status_code = 302, target_status_code = 200) 
self.assertEqual('value', self.client.session.get('key')) 

Self.client là một thể hiện của django.test.client.Client trong trường hợp này.

Cập nhật

(Đáp lại bình luận @Marconi 's) Dưới đây là một cách để hiển thị một thông điệp tới người dùng sau khi chuyển hướng. Điều này được sao chép gần như nguyên văn từ answer của tôi sang một số khác question.

Chế độ xem đầu tiên của bạn có thể tạo thông báo cho auth sử dụng hiện tại và có chế độ xem thứ hai đọc và xóa nó. Một cái gì đó như thế này:

def first_view(request, *args, **kwargs): 
    # all goes well 
    message = _("<message for user>") 
    request.user.message_set.create(message = message) 
    return redirect('second_view') 

def second_view(request, *args, **kwargs): 
    # Render page 

# Template for second_view: 
{% for message in messages %} 
    ... 
{% endfor %} 

Tin nhắn được lưu vào cơ sở dữ liệu. Điều này có nghĩa là bạn có thể truy cập chúng ngay cả sau khi chuyển hướng. Chúng được tự động đọc và xóa khi hiển thị mẫu. Bạn sẽ phải sử dụng RequestContext để làm việc này.

+0

Lý do tôi đang tìm cách kiểm tra ngữ cảnh ngay cả khi chuyển hướng là tôi đang sử dụng ứng dụng django_notify và ngay trước khi chuyển hướng, tôi đặt một số thông báo như: request.notifications.error (_ (u "Đó là email của bạn hoặc mật khẩu không chính xác ")) và sau đó chuyển hướng trở lại biểu mẫu đăng nhập để biểu mẫu không giữ lại các giá trị đã nhập trước đây và cũng làm mới không gửi lại biểu mẫu. Tôi có thể truy cập thông báo nếu không có chuyển hướng bằng cách sử dụng: response.context ['notifications'] Nhưng lỗi ở trên xuất hiện khi có chuyển hướng, tôi chỉ muốn đảm bảo rằng thông báo được hiển thị. Hay bạn có cách nào tốt hơn? – Marconi

+0

@Marconi: Tôi đã cập nhật câu trả lời của mình. Xem ở trên. –

1

Những gì tôi đã làm (để kiểm tra phiên cụ thể), là để không sử dụng khách hàng thử nghiệm của Django và để tạo ra đối tượng yêu cầu giả của riêng mình và vượt qua nó trực tiếp đến quan điểm của tôi, như thế này:

def test_method(self): 
    class request(object): 
     POST = {'dummy':'data'} 
     class session: 
      @staticmethod 
      def set_expiry(nmbr): 
       request.session.nmbr = nmbr 

    views.login(request) 
    self.assertEqual(request.session.nmbr, 1209600) 

Một tùy chọn có thể sử dụng đối số "follow = True" khi sử dụng ứng dụng khách thử nghiệm của Django.

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