Voglio eseguire un semplice progetto di test in un alias di sottodirectory sul nostro server di sviluppo. L'impostazione di base è un nginx con una posizione che passa tutto in una sottodirectory all'applicazione wsgi.Esegui l'applicazione django via nginx + uwsgi in un sottotracciato
Django ovviamente non capisce che viene eseguito in un alias di sottodirectory, che distrugge completamente la generazione e l'analisi degli URL.
Non sono riuscito a trovare alcuna impostazione di prefisso nei documenti e anche il mio google fu non mi è servito molto ... quindi mi sto chiedendo qui.
L'unica cosa che ho trovato era l'impostazione FORCE_SCRIPT_NAME che almeno corregge la generazione di URL. (vedi: http://docs.webfaction.com/software/django/config.html#mounting-a-django-application-on-a-subpath)
Purtroppo questo non risolve l'analisi urlconf, anche se il sito menzionato lo suggerisce.
È possibile eseguire un'applicazione django in un alias di sottodirectory e, in caso affermativo, come?
nginx config:
server {
location /fancyprojectname/static {
alias /srv/fancyprojectname/static;
}
location /fancyprojectname/ {
uwsgi_pass unix://var/run/uwsgi/app/fancyprojectname/socket;
include uwsgi_params;
}
}
Modifica
Così, impostando "uwsgi_param SCRIPT_NAME/fancyprojectname;" nella posizione di nginx non è necessario FORCE_SCRIPT_NAME, purtroppo la corrispondenza dell'URL non funziona ancora.
from django.conf.urls import patterns, include, url
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
)
Quello che penso quello che sta succedendo: Come l'espressione regolare amministratore inizia con "^ admin" e l'URL reale è "fancyprojectname/admin /", Django può non corrisponde correttamente gli URL, anche se lo SCRIPT_NAME è impostato.
La soluzione
Così, è stato davvero un problema con SCRIPT_NAME.
Il WSGI specification dice il seguente:
SCRIPT_NAME La parte iniziale di "percorso" del URL di richiesta che corrisponde all'oggetto applicazione, in modo che l'applicazione conosce la sua virtuale "location". Questa potrebbe essere una stringa vuota, se l'applicazione corrisponde alla "radice" del server.
PATH_INFO Il resto del "percorso" dell'URL della richiesta, che designa la "posizione" virtuale della destinazione della richiesta all'interno dell'applicazione. Questo può essere una stringa vuota, se l'URL della richiesta è rivolto alla root dell'applicazione e non ha una barra finale.
Nginx non imposta SCRIPT_NAME automaticamente, quindi è necessario impostarlo in ogni caso. In seguito PATH_INFO è sbagliato, perché nella configurazione predefinita Nginx lo imposta su $ document_uri, che sarebbe l'URL completo.
"uwsgi_modifier1 30;" dice a Nginx di impostare UWSGI_MODIFIER_MANAGE_PATH_INFO, che a sua volta dice a UWSGI di rimuovere lo SCRIPT_NAME del PATH_INFO.
La combinazione di queste impostazioni sembra funzionare, poichè Django ora può generare AND abbinare correttamente gli URL.
prega di dare un'occhiata al https://stackoverflow.com/a/40496307/1588163 Vi si possono trovare il modo aggiornato per raggiungere questo obiettivo – clapas
[Vedi anche : Come montare l'App Django con uwsgi] (https://stackoverflow.com/questions/19475651/how-to-mount-django-app-with-uwsgi) –