문제

사용자가 색 구성표 선택 등 다양한 설정을 갖는 웹 사이트를 프로그래밍하고 있습니다.이를 일반 텍스트 파일로 저장하게되어 기쁩니다. 보안은 문제가되지 않습니다.

내가 현재보고있는 방식은 다음과 같습니다. 모든 키는 사용자이며 값은 사용자 설정이있는 사전입니다.

예를 들어, userDB [ "bob"] [ "colour_scheme"]는 "blue"값을 갖습니다.

파일에 저장하는 가장 좋은 방법은 무엇입니까? 사전을 절제합니까?

내가하려는 일을하는 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

사용 cpickle 사전에서 내 선택이 될 것입니다. 사전은 이러한 종류의 데이터에 자연스럽게 적합하므로 요구 사항을 감안할 때 사용하지 않을 이유가 없습니다. 즉, 비 파이썬 응용 프로그램에서 읽는 것에 대해 생각하지 않는 한 언어 중립 텍스트 형식을 사용해야합니다. 그리고 여기에서도 피클과 수출 도구를 사용하여 도망 갈 수 있습니다.

다른 팁

나는 그것을 사용할 것이다 configparser 예제에 대해 매우 읽기 쉽고 사용자 가용성이있는 출력을 생성하는 모듈 :

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

다음 코드는 위의 구성 파일을 생성 한 다음 인쇄합니다.

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

configparser는 문자열 만 지원하므로 부울의 경우 위의대로 변환해야합니다. 보다 Effbot 기본의 좋은 런 다운을 위해.

나는 어느 것이 가장 좋은지에 대해 다루지 않습니다. 텍스트 파일을 처리하려면 고려할 것입니다 configparser -Module. 다른 하나는 시도해 볼 수 있습니다 Simplejson 또는 . 실제 DB 테이블도 고려할 수도 있습니다.

예를 들어, userattrs라는 테이블을 3 개의 열로 가질 수 있습니다.

  • int user_id
  • 문자열 속성 _name
  • 문자열 attribute_value

적은 사람이 없다면 빠른 검색을 위해 쿠키에 저장할 수 있습니다.

가장 간단한 방법이 있습니다. 간단한 변수를 사용하십시오 import 설정 파일.

userprefs.py 파일을 호출하십시오

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

응용 프로그램 에서이 파일을 가져올 수 있는지 확인해야합니다. 당신은 가지고 있습니다 많은 선택.

  1. 사용 PYTHONPATH. 필요하다 PYTHONPATH 기본 설정 파일에 디렉토리를 포함하도록 설정해야합니다.

    ㅏ. 파일의 이름을 지정하는 명시 적 명령 줄 매개 변수 (최고는 아니지만 단순함)

    비. 파일의 이름을 지정하는 환경 변수입니다.

  2. 확장 sys.path 사용자의 홈 디렉토리를 포함합니다

예시

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

데이터베이스 중심 웹 사이트의 경우 물론 최상의 옵션은 DB 테이블입니다. 나는 당신이 데이터베이스를하지 않는다고 가정합니다.

인간이 읽을 수있는 형식에 관심이 없다면 pickle 간단하고 간단한 방법입니다. 나는 또한 좋은 보고서를 들었습니다 simplejson.

인간의 가독성이 중요하다면 두 가지 간단한 옵션이 스스로를 나타냅니다.

기준 치수: 모듈 만 사용하십시오. 당신이 필요한 모든 것이 글로벌과 멋진 것이 없다면, 이것이가는 길입니다. 실제로 필사적이라면 클래스와 클래스 변수를 정의하여 섹션을 모방 할 수 있습니다. 단점 : 파일을 사용자가 수작업으로 편집하면 오류가 잡히고 디버그하기 어려울 수 있습니다.

INI 형식 : 나는 사용하고있다 configobj 이를 위해 약간의 성공을 거두었습니다. ConfigoBJ는 본질적으로 중첩 된 섹션 등을 지원하는 ConfigParser를 대체합니다. 선택적으로 파일에 대한 예상 유형 또는 값을 정의하고이를 검증하여 사용자/관리자에게 안전망 (및 중요한 오류 피드백)을 제공 할 수 있습니다.

나는 사용할 것이다 선반 또는 sqlite 데이터베이스 파일 시스템에 이러한 설정을 저장 해야하는 경우 데이터베이스. 웹 사이트를 구축하고 있기 때문에 아마도 어떤 종류의 데이터베이스를 사용하므로 사용하지 않겠습니까?

내장 sqlite3 모듈은 아마도 대부분의 대안보다 훨씬 간단 할 것이며 원하거나 필요할 때까지 전체 RDBM으로 업데이트 할 준비를 할 수 있습니다.

구성의 인간 readablity가 중요한 경우 대안이 될 수 있습니다. configparser 모듈 파일처럼 .ini를 읽고 쓸 수 있습니다. 그러나 당신은 하나의 둥지 수준으로 제한됩니다.

데이터베이스가있는 경우 데이터베이스에 설정을 저장하는 것이 좋습니다. 그러나 일반 파일이 환경에 더 잘 맞을 수있는 것처럼 들립니다.

당신은 아마 저장하고 싶지 않을 것입니다 모두 해당 파일에 동시에 액세스 할 수있는 문제가 발생할 수 있으므로 동일한 파일의 사용자 설정. 각 사용자의 설정을 자신의 절인 파일로 사전으로 저장하면 독립적으로 행동 할 수 있습니다.

산세는 그러한 데이터를 저장하는 합리적인 방법이지만 불행히도 피클 데이터 형식은 인간을 읽을 수 없습니다. 당신은 그것을 보관하는 것이 더 나을 수 있습니다 repr(dictionary) 더 읽기 쉬운 형식이 될 것입니다. 사용자 설정을 다시로드하려면 사용하십시오 eval(open("file").read()) 또는 그런 것.

이를 위해 데이터베이스를 사용하지 않는 특별한 이유가 있습니까? 정상적이고 자연스럽게해야 할 것 같습니다. 또는 사용자 ID 또는 무언가에 키가 표시된 DB에 설정의 피클을 저장합니다.

웹 사이트의 사용 패턴을 설명하지는 않았지만 일반 웹 사이트를 생각하는 것만 설명했습니다. 그러나 데이터베이스에 설정을 유지하면 파일을 사용하는 것보다 디스크 I/O가 훨씬 적을 수 있다고 생각합니다.

OTOH, 클라이언트 측 코드에서 사용할 수있는 설정의 경우 캐시를 할 수있는 정적 파일에 JavaScript로 저장하는 것은 편리합니다. 설정이 여러 곳을 가질 수있는 비용으로 편리합니다. (아마도 해당 설정을 DB에 저장하고 필요에 따라 정적 파일을 재건했습니다).

절인 사전 사용에 대한 답변에 동의합니다. 간단한 데이터를 사전 구조에 저장하는 데 매우 간단하고 효과적입니다.

파일을 직접 편집 할 수없고 파이썬 객체를 지속하는 빠른 방법을 원한다면 간물. 사람이 파일을 읽을 수 있거나 다른 앱에서 읽을 수있는 경우 사용하십시오. configparser. 더 복잡한 것이 필요한 경우, 어떤 종류의 데이터베이스를 사용하십시오.sqlite) 또는 객체 지향 (공리, ZODB).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top