2015-02-10 58 views
3

我已經設置了一個Django項目,它使用django-rest-framework來提供一些ReST功能。網站和其他功能都工作正常。API端點的Django子域配置

但是有一個小問題:我需要我的API端點指向不同的子域

例如,當用戶訪問該網站,他/她可以正常地按照我的urls.py瀏覽各地:

http://example.com/control_panel 

到目前爲止好。 但是,當使用API​​時,我想將其更改爲更合適的內容。所以,而不是http://example.com/api/tasks我需要這成爲:

http://api.example.com/tasks 

我應該怎麼做?

在此先感謝。

P.S. 該網站將在Gunicorn上運行,並將nginx作爲反向代理。

+0

你有沒有得到這個工作?我不能相信我沒有在我的搜索中找到這個,但我實際上寫了一個重複:http://stackoverflow.com/questions/29807091/deploy-django-rest-api-to-api-example-com-apache -2-2-mod-wsgi-mod-rewrite這裏提供的中間件方法是否適合你? – nicorellius 2015-04-23 22:28:06

+0

@nicorellius我設法通過使用Django-hosts包來實現它。在pypi上查看它,但是請注意,它目前僅適用於Django 1.7.x.我希望我能幫上忙。 – kstratis 2015-04-23 22:38:56

+0

@ Konos5 - 非常感謝小費!我正在努力整合這一點。確切地說,我正在尋找...嘿,有一點難以配置它,你遇到的任何提示或技巧或陷阱?例如,你是如何在API URLConf中處理你的'include(router.urls)'的? – nicorellius 2015-04-23 23:19:39

回答

1

我有一個類似的問題,基於Django的API。我發現編寫一個自定義中間件類並使用它來控制哪些URL在哪個子域上提供服務很有用。

Django在提供URL時並不關心子域,所以假設您的DNS設置爲api.example.com指向您的Django項目,那麼api.example.com/tasks/將調用預期的API視圖。

問題是www.example.com/tasks/也會調用API視圖,並且api.example.com將在瀏覽器中提供主頁。

所以有點中間件可以檢查子域匹配了網址,並提高響應404如果合適的話:

## settings.py 

MIDDLEWARE_CLASSES += (
    'project.middleware.SubdomainMiddleware', 
) 


## middleware.py 

api_urls = ['tasks'] # the URLs you want to serve on your api subdomain 

class SubdomainMiddleware: 
    def process_request(self, request): 
     """ 
     Checks subdomain against requested URL. 

     Raises 404 or returns None 
     """ 
     path = request.get_full_path() # i.e. /tasks/ 
     root_url = path.split('/')[1] # i.e. tasks 
     domain_parts = request.get_host().split('.') 

     if (len(domain_parts) > 2): 
      subdomain = domain_parts[0] 
      if (subdomain.lower() == 'www'): 
       subdomain = None 
      domain = '.'.join(domain_parts[1:]) 
     else: 
      subdomain = None 
      domain = request.get_host() 

     request.subdomain = subdomain # i.e. 'api' 
     request.domain = domain # i.e. 'example.com' 

     # Loosen restrictions when developing locally or running test suite 
     if not request.domain in ['localhost:8000', 'testserver']: 
      return # allow request 

     if request.subdomain == "api" and root_url not in api_urls: 
      raise Http404() # API subdomain, don't want to serve regular URLs 
     elif not subdomain and root_url in api_urls: 
      raise Http404() # No subdomain or www, don't want to serve API URLs 
     else: 
      raise Http404() # Unexpected subdomain 
     return # allow request 
+0

我想你的意思是:'如果request.domain在['localhost:8000','testserver']:'('不'不應該在那裏)。 – jeffjv 2015-05-14 02:16:00