2013-09-21 38 views
31

Tôi đã có một dự án django và nó logic như những:django sửa đổi đối tượng yêu cầu

url: URL username = tên & pwd = passwd

xem:

def func(request): 
    dic = request.GET 

    username = dic.get("username") 
    pwd = dic.get("pwd") 

nhưng bây giờ chúng ta cần mã hóa dữ liệu. Sau đó, yêu cầu trở thành này:

url: URL hầm mộ = XXXXXXXXXX (XXXXXXXX được mã hóa str cho "username = tên & pwd = passwd")

vì vậy tôi cần phải sửa đổi tất cả các chức năng xem?. Nhưng bây giờ tôi muốn giải mã trong django middleware để ngăn không cho sửa đổi mọi chức năng xem.

nhưng khi tôi sửa đổi request.GET, tôi recive msg msg "This QueryDict instance is immutable". Làm thế nào tôi có thể sửa đổi nó?

+8

gửi tên truy cập và mật khẩu trong url là một ý kiến ​​tồi. –

+0

Tại sao bạn cần gửi tên người dùng và mật khẩu trong chính url? –

+1

Có thể trùng lặp của [django - tại sao đối tượng request.POST không thay đổi được?] (Http://stackoverflow.com/questions/12611345/django-why-is-the-request-post-object-immutable) –

Trả lời

2

Bạn không nên sử dụng GET để gửi tên người dùng và mật khẩu, thực tiễn không tốt (vì nó hiển thị thông tin trên thanh URL và có thể đặt ra security risk). Thay vào đó, hãy sử dụng POST. Ngoài ra, tôi đoán bạn đang cố gắng xác thực người dùng của mình và có vẻ như bạn đang làm quá nhiều việc (tạo một phần mềm trung gian mới) để xử lý nội dung được tích hợp hoàn toàn, lấy ví dụ from the docs:

from django.contrib.auth import authenticate, login 

def my_view(request): 
    username = request.POST['username'] 
    password = request.POST['password'] 
    user = authenticate(username=username, password=password) 
    if user is not None: 
     if user.is_active: 
      login(request, user) 
      # Redirect to a success page. 
     else: 
      # Return a 'disabled account' error message 
    else: 
     # Return an 'invalid login' error message. 

Bản thân tôi thực sự thích sử dụng login_required decorator, rất đơn giản để sử dụng. Hy vọng rằng sẽ giúp

+0

cảm ơn vì câu trả lời. đó chỉ là một ví dụ. Chúng tôi không chỉ sử dụng GET mà còn sử dụng POST. Mặc dù sử dụng bài viết, chúng tôi phải mã hóa dữ liệu.Bởi vì tôi sợ một số công cụ như gói dữ liệu thu thập dữ liệu 'tcpdump'. Do đó, mã hóa/giải mã là cần thiết.Câu hỏi gây nhầm lẫn cho tôi là làm cách nào tôi có thể sửa đổi chức năng xem ít nhất có thể. Vì vậy, tôi muốn sử dụng phần mềm trung gian – user2801567

+0

Xem tài liệu về cách tạo phần mềm trung gian của riêng bạn. Bạn muốn sử dụng process_request hoặc process_view, nhưng hãy nhớ rằng truy cập vào yêu cầu.POST bên trong những người sẽ gây ra xem không chạy (csrf là ​​một ngoại lệ cho quy tắc đó, do đó, nhìn vào cách nó hoạt động để tìm cách viết của riêng bạn) https://docs.djangoproject.com/en/dev/topics/http/middleware/ – yuvi

+0

Ngoài ra, không chắc chắn bao nhiêu đó là có liên quan nhưng hãy xem này: https://pypi.python.org/pypi/django-secure – yuvi

54

django.http.QueryDict các đối tượng được gán cho request.GETrequest.POST là không thay đổi.

Bạn có thể chuyển nó sang một QueryDict dụ có thể thay đổi bằng cách sao chép nó:

request.GET = request.GET.copy() 

Sau đó bạn sẽ có thể thay đổi QueryDict:

>>> from django.test.client import RequestFactory 
>>> request = RequestFactory().get('/') 
>>> request.GET 
<QueryDict: {}> 
>>> request.GET['foo'] = 'bar' 
AttributeError: This QueryDict instance is immutable 
>>> request.GET = request.GET.copy() 
<QueryDict: {}> 
>>> request.GET['foo'] = 'bar' 
>>> request.GET 
<QueryDict: {'foo': 'bar'}> 

này đã được thiết kế cố tình để không ai của các thành phần ứng dụng được phép chỉnh sửa dữ liệu yêu cầu nguồn, do đó, ngay cả việc tạo một bất biến QueryDict một lần nữa sẽ phá vỡ thiết kế này. Tôi vẫn khuyên bạn nên làm theo các nguyên tắc và chỉ định dữ liệu yêu cầu bổ sung trực tiếp trên đối tượng request trong phần mềm trung gian của bạn, mặc dù thực tế rằng nó có thể khiến bạn chỉnh sửa nguồn của mình.

24

Remove bất biến:

if not request.GET._mutable: 
    request.GET._mutable = True 

# now you can spoil it 
request.GET['pwd'] = 'iloveyou' 
+3

. để tránh chi phí liên quan đến bản sao() trên yêu cầu POST –

+9

... nhưng tệ hơn vì nó sửa đổi thuộc tính nội bộ. –

+2

Sau khi thiết lập (các) giá trị của bạn, bạn chỉ có thể thực hiện: 'request.GET._mutable = False' để làm cho nó không thể sửa lại. – Caumons

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