2010-07-20 8 views
35

¿Dónde deberían vivir las funciones de utilidad en Django? Funciones como el cifrado/descifrado personalizado de un número, el envío de tweets, el envío de correos electrónicos, la verificación de la propiedad de objetos, la validación de entradas personalizadas, etc. Cosas repetitivas y personalizadas que utilizo en varios lugares de mi aplicación. Definitivamente estoy rompiendo SECO en este momento.¿Dónde deberían vivir las funciones de utilidad en Django?

Vi algunas demostraciones donde las funciones se definían en models.py, aunque eso no me parecía conceptualmente correcto. ¿Deberían ir en una aplicación de "utilidades" que se importe en mi proyecto? Si es así, ¿a dónde van en la aplicación de utilidades? ¿El archivo models.py está allí?

Gracias por ayudarnos a sacar este n00b.

ACTUALIZACIÓN: Déjame ser aún más específico. Digamos que necesito una función "light_encrypt (number)" que toma el param "número", lo multiplica por 7, agrega 10 y devuelve el resultado, y otra función "light_decrypt (encr_number) que toma el param" encr_number ", resta 10, se divide por 7 y devuelve los resultados. ¿En qué parte de mi árbol de Django pondría esto? Esto no es middleware, ¿verdad? Como Félix sugiere, ¿creo un paquete de Python e importarlo a la vista donde necesito estas funciones?

+1

Puede crear un paquete Python normal. –

+1

relacionado: http://stackoverflow.com/questions/3224902/django-what-is-the-most-ideal-place-to-store-project-specific-middleware/3224926#3224926 – eruciform

Respuesta

19

diferente pero question misma respuesta:

Mi diseño habitual para un sitio Django es:

projects/ 
templates/ 
common/ 
local/ 

Dónde:

  • proyectos contiene su proyecto principal y las demás
  • común contiene cosas que usted puede compartir a través de sitios, o son al menos no-proyecto específico, al igual que si es necesario descargar django-perfil y django-registration en lugar de tenerlo directamente en python/site-packages
  • plantillas contiene solo eso
  • local contiene elementos que serán específicos de la máquina actual, para que pueda tener datos separados adecuadamente, como la ubicación de la base de datos y contraseña - Luego, soft-link el ver específico de la máquina sions (diga "machine1-localconfig.py") a local/localconfig.py y luego puede "importar localconfig" en settings.py
  • Generalmente coloco el middleware que es específico del proyecto dentro de un proyecto, y el middleware que no es específico del proyecto en común/middleware/
  • asegúrese de agregar el directorio de plantillas al lugar correcto en la configuración (o muy probablemente, localconfig.py y luego importarlo en la configuración), y asegúrese de agregar los directorios de proyectos, comunes y locales a tu PYTHONPATH.
+0

Gracias por la respuesta, eruciforme. Entonces, con mi ejemplo de "light_encrypt (number)" arriba, ¿sugerirías que ponga esto en común? – mitchf

+1

Sí, si un día vas a usarlo en otro proyecto, mejor tenerlo en 'common/util/encrypt.py' (o lo que sea) y asegurarte de que no tenga enlaces internos a ningún proyecto específico . será más fácil de reutilizar y también más fácil de transportar si necesitas mover las cosas más tarde. también más limpio desde el punto de vista de ocultación de datos. :-) – eruciform

+7

oh, si lo pones en 'common/util/encrypt.py', asegúrate de tocar un espacio en blanco' common/util/__ init __. Py' para que 'from common.util.encrypt import light_encrypt' funcione correctamente – eruciform

12

bien, después de leer los comentarios y contestar aquí he decidido crear un directorio llamado "/ util/común" dentro de directorio de mi proyecto. Dentro de eso tengo un archivo "__ init__.py" donde tengo mis pequeñas funciones auxiliares.

Supongo que si el archivo es demasiado grande, voy a dividir las funciones en archivos .py individuales en común. Entonces, mi estructura de proyecto se ve así. Por favor, corrija si estoy tomando malas decisiones, estoy lo suficientemente adelantado en el desarrollo que puedo solucionarlo ahora, ¡mientras todavía es fácil hacerlo!

myproject/   (Django project) 
    common/ 
    util/ 
     __init__.py (helper functions) 
    middleware/  (custom middleware) 
    templates/  (project templates) 
    myapp/ 
    fixtures/  (initial data to load) 
    migrations/ (south migrations) 
    urls/ 
    views/ 
    admin.py 
    forms.py 
    models.py 
    test.py 

public/   (static stuff not served by Django) 
    media/ 
    css/ 
    img/ 
    js/ 
    lib/ 
+0

FWIW, veo en la aplicación django-profiles que ubernostrum creó un archivo utils.py en el mismo directorio que urls.py y views.py para contener sus funciones de utilidad – mitchf

+0

Mientras estoy aquí. No se olvide de la expresión común en python para importar en __init__.py cosas que desee a nivel de módulo, pero podría/debería vivir en su propio archivo para la separación. http://mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html es una buena reseña sobre eso. – Hylidan

1

Aquí hay otra manera de hacerlo:

Si las funciones de utilidad puede ser un módulo independiente y está utilizando un entorno virtualenv para su aplicación Django continuación, puede agrupar la funcionalidad que un paquete e instálelo en su virtualenv.

Esto hace que sea fácil importar donde quiera que lo necesite en su aplicación django.

+2

sería bueno si mostrara cómo hacer un paquete fácil – dalore

Cuestiones relacionadas