Tengo experiencia en alojar proyectos simples de Django en la plataforma Pythonanywhere ( no tuve que instalar nginx y uWSGI ).
Mucha gente usa nginx+Uwsgi con Django, ¿por qué sería necesario?
Espero que nginx sea un servidor web, equilibrador de carga, proxy de correo y caché HTTP. Uwsgi es una interfaz de puerta de enlace del servidor web.
¿Todas esas cosas se incluyen por defecto en las plataformas Heroku/Pythonanywhere?
Desarrollador de PythonAnywhere aquí: sí, así es, tenemos nginx y uWSGI instalados. Cuando crea un sitio web en la página "Web" de nuestro sitio, lo que sucede en el fondo es (simplificando un poco) que generamos los archivos de configuración nginx/uWSGI apropiados para usted e iniciamos todo para que solo tenga que trabajar en el código Django.
La razón por la que esas herramientas (o similares como Apache y mod_wsgi) son necesarias es que el servidor web incorporado de Django no está diseñado para uso en producción. Puede ejecutar su comando "manage.py runserver" para que sirva páginas en su propia máquina, pero el sistema que usa para eso no está diseñado para la seguridad o la eficiencia, solo proporciona una manera fácil de hacer que algo funcione. para fines de depuración. Lo mismo es cierto para los servidores web integrados para los otros marcos web de Python como Flask y web2py.
nginx está diseñado para ser rápido, eficiente y seguro, por lo que es una mejor opción para manejar las solicitudes web entrantes cuando su sitio web está en Internet público y, por lo tanto, está sujeto a grandes cantidades de tráfico (si tiene suerte y su sitio despega) y también al abuso de los piratas informáticos. Eso no quiere decir que automáticamente haga que su sitio sea rápido y seguro, por supuesto, pero al menos significa que está comenzando con el sistema correcto. También es mucho mejor para servir archivos estáticos (como su CSS, JavaScript, imágenes, etc.) que Django, porque para eso fue creado.
uWSGI está diseñado para recibir solicitudes web entrantes y delegar su procesamiento de manera rápida y eficiente a múltiples procesos de trabajo, luego recopilar las respuestas y enviarlas de regreso a nginx.
Por supuesto, en teoría, todo eso podría integrarse en Django, pero sería mucho trabajo para el equipo de Django hacerlo, y sería una pérdida de tiempo para ellos reinventar la rueda en lugar de centrándose en las áreas donde Django proporciona sus beneficios reales, facilitando el desarrollo rápido de sitios web complejos.