2015-02-10 5 views
3

Я создал проект Django, который использует django-rest-framework для предоставления некоторых функций ReST. Веб-сайт и остальные функции работают нормально.Конфигурация поддомена Django для конечных точек API

Однако есть одна небольшая проблема: мне нужны конечные точки 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-and-mod-rewrite Был ли предложенный нами подход промежуточного ПО работает для вас? – nicorellius

+0

@nicorellius Мне удалось заставить его работать, используя пакет Django-hosts. Посмотрите на pypi, но помните, что он работает только на Django 1.7.x. Надеюсь, я помог. – kstratis

+0

@ Konos5 - большое спасибо за подсказку! Сейчас я работаю над интеграцией. Именно то, что я искал ... Эй, немного усложнив настройку, какие-нибудь советы или трюки или подводные камни, с которыми вы столкнулись? Например, как вы обрабатывали свой 'include (router.urls)' в API URLConf? – nicorellius

ответ

1

У меня была аналогичная проблема с API на основе Django. Я счел полезным написать собственный класс промежуточного программного обеспечения и использовать его для контроля того, какие URL-адреса были отправлены на поддоменах.

Django действительно не заботится о субдоменах при обслуживании URL-адресов, поэтому, предполагая, что ваш DNS настроен таким образом, что api.example.com указывает на ваш проект Django, api.example.com/tasks/ вызовет ожидаемый API Посмотреть.

Проблема заключается в том, что www.example.com/tasks/ также вызывает представление API, а api.example.com будет обслуживать домашнюю страницу в браузере.

Так немного промежуточного программного обеспечения можно проверить, что субдомены совпадают с URL-адресов и поднять 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

Я думаю, вы имели в виду: 'if request.domain в ['localhost: 8000', 'testserver']:' ('not' не должно быть там). – jeffjv

0

насчет django-dynamicsites-lite. И ваш код будет более чистым, потому что API и сайт находятся в разных папках.

Смежные вопросы