Pregunta

Estoy programando un sitio web en el que los usuarios tendrán una serie de configuraciones, como su elección de combinación de colores, etc. Estoy feliz de almacenarlas como archivos de texto sin formato, y la seguridad no es un problema.

La forma en que lo veo actualmente es: hay un diccionario, donde todas las claves son usuarios y los valores son diccionarios con la configuración de los usuarios en ellos.

Por ejemplo, userdb [" bob "] [" colour_scheme "] tendría el valor " azul " ;.

¿Cuál es la mejor manera de almacenarlo en el archivo? ¿Decapado del diccionario?

¿Hay mejores formas de hacer lo que estoy tratando de hacer?

¿Fue útil?

Solución

Usar cPickle en el diccionario sería mi elección. Los diccionarios son un ajuste natural para este tipo de datos, por lo que, dado sus requisitos, no veo ninguna razón para no usarlos. Eso, a menos que esté pensando en leerlos desde aplicaciones que no sean de python, en cuyo caso tendría que usar un formato de texto neutral para el idioma. E incluso aquí podría salirse con la de pickle más una herramienta de exportación.

Otros consejos

Usaría el módulo ConfigParser , que produce un resultado bastante legible y editable por el usuario para su ejemplo:

[bob]
colour_scheme: blue
british: yes
[joe]
color_scheme: that's 'color', silly!
british: no

El siguiente código produciría el archivo de configuración anterior y luego lo imprimirá:

import sys
from ConfigParser import *

c = ConfigParser()

c.add_section("bob")
c.set("bob", "colour_scheme", "blue")
c.set("bob", "british", str(True))

c.add_section("joe")
c.set("joe", "color_scheme", "that's 'color', silly!")
c.set("joe", "british", str(False))

c.write(sys.stdout)  # this outputs the configuration to stdout
                     # you could put a file-handle here instead

for section in c.sections(): # this is how you read the options back in
    print section
    for option in c.options(section):
            print "\t", option, "=", c.get(section, option)

print c.get("bob", "british") # To access the "british" attribute for bob directly

Tenga en cuenta que ConfigParser solo admite cadenas, por lo que tendrá que convertir como lo hice anteriormente para los booleanos. Consulte effbot para ver un buen resumen de los conceptos básicos.

No abordo la pregunta cuál es la mejor. Si desea manejar archivos de texto, consideraría ConfigParser - módulo . Otro que podría probar sería simplejson o yaml . También puedes considerar una tabla db real.

Por ejemplo, podría tener una tabla llamada userattrs, con tres columnas:

  • Int user_id
  • String attribute_name
  • String attribute_value

Si solo hay unos pocos, puede almacenarlos en cookies para una recuperación rápida.

Esta es la forma más sencilla. Use variables simples e importar el archivo de configuración.

Llame al archivo userprefs.py

# a user prefs file
color = 0x010203
font = "times new roman"
position = ( 12, 13 )
size = ( 640, 480 )

En su aplicación, debe asegurarse de poder importar este archivo. Tiene muchas opciones.

  1. Utilizando PYTHONPATH . Exigir que PYTHONPATH esté configurado para incluir el directorio con los archivos de preferencias.

    a. Un parámetro de línea de comando explícito para nombrar el archivo (no es el mejor, pero es simple)

    b. Una variable de entorno para nombrar el archivo.

  2. Extender sys.path para incluir el directorio de inicio del usuario

Ejemplo

import sys
import os
sys.path.insert(0,os.path.expanduser("~"))
import userprefs 
print userprefs.color

Para un sitio web basado en una base de datos, por supuesto, su mejor opción es una tabla db. Supongo que no está haciendo lo de la base de datos.

Si no le interesan los formatos legibles por humanos, entonces pickle es una forma simple y directa de hacerlo. También he escuchado buenos informes sobre simplejson .

Si la legibilidad humana es importante, se presentan dos opciones simples:

Módulo: solo use un módulo. Si todo lo que necesita son unos pocos globales y nada lujoso, entonces este es el camino a seguir. Si realmente te desesperaste, podrías definir clases y variables de clase para emular secciones. La desventaja aquí: si el archivo será editado manualmente por un usuario, los errores podrían ser difíciles de detectar y depurar.

Formato INI: He estado usando ConfigObj por esto, con bastante éxito. ConfigObj es esencialmente un reemplazo para ConfigParser, con soporte para secciones anidadas y mucho más. Opcionalmente, puede definir los tipos o valores esperados para un archivo y validarlo, proporcionando una red de seguridad (y comentarios de error importantes) para los usuarios / administradores.

Utilizaría shelve o un < a href = "http://www.python.org/doc/2.5.2/lib/module-sqlite3.html" rel = "nofollow noreferrer"> sqlite si tuviera que almacenar estos ajustes en El sistema de archivos. Aunque, dado que está creando un sitio web, probablemente utilice algún tipo de base de datos, ¿por qué no usarlo?

El módulo sqlite3 integrado probablemente sea mucho más simple que la mayoría de las alternativas, y lo prepara para actualizar a un RDBMS completo si alguna vez lo desea o necesita.

Si la legibilidad humana de los archivos de configuración es importante, una alternativa podría ser el módulo ConfigParser que te permite leer y escribir archivos tipo .ini. Pero entonces estás restringido a un nivel de anidación.

Si tiene una base de datos, podría sugerirle que guarde la configuración en la base de datos. Sin embargo, parece que los archivos comunes podrían adaptarse mejor a su entorno.

Probablemente no desee almacenar todo la configuración de los usuarios en el mismo archivo, ya que podría tener problemas con el acceso simultáneo a ese archivo. Si almacenó la configuración de cada usuario como un diccionario en su propio archivo en vinagre, entonces podrían actuar de forma independiente.

El decapado es una forma razonable de almacenar dichos datos, pero desafortunadamente el formato de los datos de encurtido es notoriamente no legible por humanos. Puede que sea mejor almacenarlo como repr (diccionario) , que será un formato más legible. Para volver a cargar la configuración del usuario, use eval (abrir (" archivo "). Read ()) o algo por el estilo.

¿Hay alguna razón particular por la que no está utilizando la base de datos para esto? Parece que lo normal y lo natural es hacerlo, o almacenar una serie de ajustes en la base de datos en la identificación del usuario o algo así.

No ha descrito los patrones de uso del sitio web, solo está pensando en un sitio web general, pero creo que mantener la configuración en una base de datos causaría mucho menos E / S de disco que el uso de archivos.

OTOH, para las configuraciones que pueden ser utilizadas por el código del lado del cliente, almacenarlas como javascript en un archivo estático que se puede almacenar en la memoria caché sería útil, a expensas de tener múltiples ubicaciones, es posible que tenga configuraciones. (Probablemente almacenaría esa configuración en la base de datos y reconstruiría los archivos estáticos según sea necesario)

Estoy de acuerdo con la respuesta sobre el uso de Pickled Dictionary. Muy simple y efectivo para almacenar datos simples en una estructura de diccionario.

Si no le importa poder editar el archivo usted mismo y desea una forma rápida de conservar los objetos de Python, vaya con pickle . Si desea que un humano pueda leer el archivo, o que pueda leerlo cualquier otra aplicación, use ConfigParser . Si necesita algo más complejo, vaya con algún tipo de base de datos, ya sea relacional ( sqlite ) u orientado a objetos ( axiom , zodb ).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top