2010-08-12 28 views
5

Tôi đã sửa đổi phần mềm trung gian multihost.py mà tôi tìm thấy tại http://effbot.org/zone/django-multihost.htm để cài đặt.SITE_ID động, nhưng có một số lo ngại rằng tôi có thể vừa rời khỏi đặt chỗ.An toàn để sửa đổi cài đặt.SITE_ID từ phần mềm trung gian ở Django?

Hầu hết các ví dụ tôi đã tìm thấy cho nhiều miền lưu trữ đã được thiết lập với nhiều tệp settings.py được mã hóa cứng thành SITE_ID tương ứng của chúng.

Tôi đã tạo bản sửa lỗi có lỗ hổng nghiêm trọng ở đây chưa? Sẽ thay đổi giá trị này tự động cắn tôi vào **.

from django.conf import settings 
from django.contrib.sites.models import Site 

class MultiHostMiddleware: 

    def process_request(self, request): 
     try: 
      host_raw = request.META["HTTP_HOST"] 
      colon = host_raw.find(':') 
      if colon > -1: 
       host = host_raw[0:colon] 
      else: 
       host = host_raw 

      s = Site.objects.get(domain=host) 
      if s: 
       settings.SITE_ID = s.id 

     except KeyError: 
      pass # use default urlconf (settings.ROOT_URLCONF) 

Để biết điều này đang diễn ra và đang chạy cho đến nay, nhưng không chịu được lưu lượng truy cập thực tế.

+0

Không có ý tưởng cho dù điều đó sẽ làm việc, nhưng tôi tự hỏi liệu việc sử dụng 'urlparse' sẽ tốt hơn cho việc nhận tên máy (http://docs.python.org/library/urlparse.html). –

+0

Thông tin bổ sung, mã này đã được đặt trên một trang web tên miền 2 trong khoảng một tuần nay mà không có trục trặc rõ ràng. Lưu lượng truy cập khá thấp nhưng tôi cho rằng khái niệm này vẫn giữ nguyên. –

Trả lời

6

Câu trả lời ngắn gọn, chính thức là you're not supposed to do this, mặc dù tài liệu không thực sự giải thích tại sao không.

Nếu bạn đang sử dụng máy chủ được tạo luồng, tôi sẽ lo ngại về điều kiện chủng tộc. Điều này khá đơn giản để kiểm tra; chỉ cần gọi tới sleep() trong một chế độ xem, sau đó trả lại HttpResponse với tên của trang web hiện tại. Trong khi chế độ xem đầu tiên đang ngủ, hãy nhấn một chế độ xem khác trên một tên miền khác.

Nếu bạn sử dụng prefork, tôi không nghĩ rằng điều này sẽ gây ra bất kỳ vấn đề. Tôi đã sử dụng phương pháp này với matplotlib, vì nó dễ dàng nhất để thiết lập các thuộc tính đồ thị bằng cách thay đổi cấu hình chung với matplotlib.rcParams.update(). Tôi sử dụng prefork fcgi, vì vậy tôi có thể giả định một cách an toàn rằng mỗi yêu cầu có toàn bộ quá trình cho chính nó (folks, xin vui lòng sửa tôi nếu tôi sai).

Sửa: Tôi nghĩ bạn có thể làm những gì bạn muốn sử dụng RequestSite bởi vô hiệu hóa ứng dụng sites. Ví dụ: django-registration của James Bennett, khởi tạo đối tượng RequestSite trong trường hợp đó, trích xuất tên máy chủ từ đối tượng yêu cầu.

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