1 votes

API et page principale comme deux processus séparés

SITUATION

J'ai créé une API REST pour mon application mobile et je veux maintenant créer un site web. L'API est jusqu'à présent très très simple, juste pour quelques requêtes comme "obtenir la liste des contenus", "mettre à jour un champ dans la base de données", etc. Mais maintenant, je veux créer un site web qui utilisera la même base de données bien sûr. Je ne pense pas que cette API sera utile pour le projet de site Web.

QUESTION

Est-il préférable de garder l'API et le site web séparément, sur deux instances gunicorn différentes, ou est-il préférable de les fusionner ? Par exemple, l'API sur api.example.com avec adresse 127.0.0.1:8001 et site web sur example.com avec adresse 127.0.0.1:8002 et bien sûr sur deux configurations différentes du serveur nginx (2 fichiers dans sites-available/enabled si vous ne comprenez toujours pas ce que je veux dire :P) ? Ou bien cela n'a pas d'importance sur les performances de traitement des requêtes et il est préférable de faire un seul projet avec un lien. example.com/api/... ?

0 votes

Votre API ne me semble pas être une API REST - d'après votre description, il s'agit d'une API RPC - JSON n'est pas une API REST. Pour ce qui est de la question, cela dépend, mais je dirais que dans la plupart des cas, il vaut mieux séparer.

0 votes

Si vous aviez créé une API RESTful, je pense que vous l'utiliseriez dans le nouveau web.

0voto

jjmontes Points 3127

Pour la production, je recommande de garder les applications séparées comme vous le suggérez (dans deux sites nginx différents).

Divisez votre projet Django en applications : par exemple, 'core', 'api', 'web'. De cette façon, vous pouvez partager l'application contenant les modèles et la logique 'core', et faire en sorte que les deux autres applications 'api' et 'web' réutilisent ce code.

Comme vous décrivez en fait deux services (API et web), vous pouvez facilement créer deux settings.py et wsgi différents pour Django, chacun d'eux incluant les applications appropriées. Il s'agit d'une approche courante : chaque application inclut et expose uniquement le code dont elle a besoin. Le fait d'avoir des noms de domaine et des services distincts permet une distribution plus facile et plus efficace au fur et à mesure que le site se développe. En outre, cela permet d'affiner plus facilement la configuration de chaque application (paramètres de journalisation, intergiciels, etc.).

Si votre application n'a pas besoin de prendre en charge autant de requêtes, je me contenterais de conserver un seul settings.py et d'utiliser simplement des URL pour diriger les requêtes vers une application ou une autre. Vous pouvez également procéder ainsi pour le développement.

Si vous souhaitez inclure une ou plusieurs URL en fonction des paramètres, utilisez quelque chose comme :

# Your generic URL patterns
urlpatterns = patterns('',   
    #(r'^static/(?P<path>.*)$', 'django.views.static.serve'),
    ...
)

if settings.ENABLE_API:
    urlpatterns += patterns('', 
        url(r'^', include('myapi.urls')),
    ) 

if settings.ENABLE_WEB:    
    urlpatterns += patterns('', 
        url(r'^', include('web.urls')),
        #url(r'^admin/', include(admin.site.urls)),
    ) 

Ce qui précède n'est qu'un exemple, l'idée étant que vous pouvez construire vos modèles d'URL de manière conditionnelle ou, par exemple, utiliser l'opérateur + pour leur ajouter d'autres modèles. Pour plus d'informations, voir https://docs.djangoproject.com/en/dev/topics/http/urls/ .

0 votes

Ainsi, vous proposez de créer par exemple un api-settings.py con api.wsgi y web-settings.py con web.wsgi Où dans api-settings l'application api sera incluse mais pas le web ? Mais que faire avec les urls ? Les définir également dans api-settings y web-settings a urls.py dans chaque application ? Et j'utilise Django 1.7 avec Python 3.4.

0 votes

Oui, c'est possible. Pour les URL, vous pouvez également faire pointer votre settings.py vers différents urls.py, qui incluent alors les urls.py appropriés des sous-applications (rappelez-vous que vous pouvez et devez avoir un urls.py sur chaque application, y compris avec ie. url(r'^api/1.0/', include('myapi.urls', namespace='myapi')) ). Pour l'organisation, je garde généralement les URLs d'api dans "/api/", ce qui n'entre pas en conflit avec le site web ou d'autres applications, même si elles sont déployées dans le même processus. J'espère avoir fait preuve de bon sens...

0 votes

Oui, je garde mes urls dans chaque application. J'ai demandé cette option dans settings.py car si je n'inclus pas l'application web dans api-settings.py alors l'inclusion dans urls.py principal peut provoquer une erreur. Ou est-ce que je me trompe ?

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X