2009-05-08 23 views
19

Làm cách nào tôi có thể làm việc với miền phụ trong công cụ ứng dụng của Google (python).Làm việc với tên miền phụ trong công cụ ứng dụng google

Tôi muốn có phần tên miền đầu tiên và thực hiện một số hành động (trình xử lý).

Ví dụ:
          product.example.com -> gửi đến xử lý các sản phẩm
          user.example.com -> gửi đến xử lý người dùng

Trên thực tế, sử dụng đường dẫn ảo tôi có mã này:

application = webapp.WSGIApplication(
    [('/', IndexHandler), 
    ('/product/(.*)', ProductHandler), 
    ('/user/(.*)', UserHandler) 
    ] 

Trả lời

26

WSGIApplication không có khả năng định tuyến dựa trên miền. Thay vào đó, bạn cần phải tạo một ứng dụng riêng biệt cho mỗi tên miền phụ, như thế này:

applications = { 
    'product.example.com': webapp.WSGIApplication([ 
    ('/', IndexHandler), 
    ('/(.*)', ProductHandler)]), 
    'user.example.com': webapp.WSGIApplication([ 
    ('/', IndexHandler), 
    ('/(.*)', UserHandler)]), 
} 

def main(): 
    run_wsgi_app(applications[os.environ['HTTP_HOST']]) 

if __name__ == '__main__': 
    main() 

Cách khác, bạn có thể viết subclass WSGIApplication của riêng bạn mà biết làm thế nào để xử lý nhiều máy chủ.

+0

Cảm ơn bạn! Bạn có một số mẫu của WSGIApplication phụ này với tôi? Tôi đang nói với python ... – Zote

+0

Kiểm tra nguồn của mã hiện tại tại http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/webapp/__init__ .py - sửa đổi phương thức __call__ để tính đến tên máy chủ nên khá đơn giản. –

+0

Đoạn mã trên dường như không hoạt động trong sản xuất với cả hai tên miền phụ được liên kết với một ứng dụng GAE. Có ai có được điều này để làm việc? – kovshenin

2

Tôi thích ý tưởng từ Nick nhưng tôi gặp sự cố hơi khác. Tôi muốn kết hợp một tên miền phụ cụ thể để xử lý nó một chút khác nhau, nhưng tất cả các miền phụ khác sẽ được xử lý giống nhau. Đây là ví dụ của tôi.

import os 

def main(): 
    if (os.environ['HTTP_HOST'] == "sub.example.com"): 
     application = webapp.WSGIApplication([('/(.*)', OtherMainHandler)], debug=True) 
    else: 
     application = webapp.WSGIApplication([('/', MainHandler),], debug=True) 

    run_wsgi_app(application) 


if __name__ == '__main__': 
    main() 
Các vấn đề liên quan