2012-02-22 4 views
71

첫 번째 Flask 앱을 ​​제작하고 있으며 내 애플리케이션을 구성하는 훌륭하고 깨끗한 Pythonic 방식을 이해할 수 없습니다. 모든 것을 한 예로 .py 파일에 갖고 싶지는 않습니다. 내 앱의 각 부분을 별도의 모듈로 만들고 싶습니다. 물건을 정리하는 좋은 방법은 무엇입니까?비교적 큰 Flask 응용 프로그램을 구성하는 방법은 무엇입니까?

+3

나는 레이아웃이 여기에 설명 된 것을 매우 좋아한다. http://flask.pocoo.org/docs/patterns/packages/ – obmarg

+1

그들은 순환 수입을 사용하여 피하고 싶다. – daniels

+0

사실, app.route 데코레이터를 사용하려면 피할 수 없다고 생각합니다. – obmarg

답변

78

나는 플라스크 상용구 "Fbone"라는 프로젝트를 확인해 주시기 바랍니다 포크 :

Fbone (플라스크 뼈)을 플라스크 (파이썬 microframework) 템플릿/부트 스트랩/보일러 응용 프로그램입니다을 만들었습니다.

개요

  • 잘 청사진을 사용하여 큰 프로젝트를 위해 설계.
  • 가장 중요한 프론트 엔드 프레임 워크 인 jQuery/html5boilerplate/bootstrap과 통합하십시오.
  • 유명한 SQLalchemy에 의해 지원됩니다.
  • 플라스크 로그인으로 까다로운 "기억하기"를 구현하십시오.
  • 플라스크 - 주형으로 웹 폼을 처리하십시오.
  • 플라스크 테스트 및 코를 이용한 단위 테스트.
  • 패브릭과 mod_wsgi (예제 포함)를 통해 쉽게 배포 할 수 있습니다. 플라스크 - 바벨로
  • 국제화는

BTW, 난 그냥 유용한 플라스크있는 대형 프로젝트를 빌드에서이 wiki을 발견, pls는 그것을 확인!

+1

끝내주는 상용구, 잘 했어! –

+0

정말 마음에 들어요. 고맙습니다! – jdsantiagojr

+0

README에 자세히 나와있는 'fab d'를 실행하기 전에 'source env/bin/activate'를 사용하여 가상 환경을 활성화해야합니다. – JRG

20

플라스크 0.7은 Blueprints을 구현합니다. 기본 응용 프로그램 객체를 가져 오지 않고 route 데코레이터를 사용하면 좋습니다.

+1

청사진은 모듈과 어떻게 다른가요? – dcolish

+1

기술적으로 청사진은 Blueprint 클래스의 인스턴스입니다. 하나 이상의 모듈로 확장 할 수 있으며 여러 모듈을 동일한 모듈에 공존시킬 수 있습니다. 장면 뒤에는 청사진의 모듈이나 패키지를 알아내는'마술'과'정적'폴더가 있습니다. –

+1

플라스크 뼈 프로젝트에 청사진을 통합했습니다. 내 대답 pls를 참조하십시오. – imwilsonxu

12

저는 (내 기준으로) 큰 플라스크 프로젝트 (5000 라인의 파이썬 코드와 그것은 절반 만 완성되었습니다)에서 작업하고 있습니다. 고객은 프로젝트 모듈되고 싶어, 그래서 나는이 apporach을했다 :

내 폴더 구조는 다음과 같습니다 modules.yml에서

├── __init__.py 
├── modules.yml 
├── config 
├── controllers 
│ └── ... 
├── lib: Common functions I use often 
│ └── ... 
├── models 
│ └── ... 
├── static: All static files 
│ ├── css 
│ ├── img 
│ └── js 
└── templates: Jinja2 templates 
    └── ... 

내가 이름과 URL을 포함하여 내 모듈을 정의합니다. 이 방법으로 고객은 단일 Python 파일을 건드리지 않고도 모듈을 활성화/비활성화 할 수 있습니다. 또한 모듈 목록을 기반으로 메뉴를 생성합니다. 관습에 따라 모든 모듈에는 에 파이썬 모듈이 있고 modelmodels/에서로드합니다. 모든 컨트롤러는 컨트롤러 이름으로 저장된 Blueprint을 정의합니다. 예 : user 모듈, 내가 controllers/user.py에 있습니다

# Module name is 'user', thus save Blueprint as 'user' variable 
user = Blueprint('user', __name__) 

@user.route('/user/') 
def index(): 
    pass 

이 방법은, 내 __init__.py와 부하의 modules.yml을 읽을 수있는 동적으로 활성화 된 모든 모듈을 등록 : 나는 희망

# Import modules 
for module in modules: 

    # Get module name from 'url' setting, exculde leading slash 
    modname = module['url'][1:] 

    try: 
     # from project.controllers.<modname> import <modname> 
     mod = __import__(
      'project.controllers.' + modname, None, None, modname 
     ) 
    except Exception as e: 
     # Log exceptions here 
     # [...] 

    mod = getattr(mod, modname) # Get blueprint from module 
    app.register_blueprint(mod, url_prefix=module['url']) 

를이 될 수 있습니다 당신을위한 영감을 얻으십시오 :)

+0

테스트 파일은 어디에 두시겠습니까? – Alp

+1

위에서 설명한 구조는 실제로 프로젝트 이름 ('project_name /')을 가진 서브 디렉토리입니다. 'tests /'폴더와'scripts /'폴더 (실행 스크립트 용)도 있습니다.'tests /'의 경우, 모델 테스트를 위해서는'tests/models /', 컨트롤러 테스트를 위해서는'tests/controllers /'와 같은 구조를 사용하는 것이 현명한 방법입니다. 구조를 유지하는 데 약간의 오버 헤드가 필요하지만 필요한 파일을 찾기가 매우 쉽습니다. – msiemens

15

제목에 Matt Wright의 wonderful post을 반드시 읽으십시오.

포스트 기능 :

  1. 큰 플라스 프로젝트

  2. An example application on Github

  3. 일반에서 최고의 디자인 사례에 대한 설명을위한 구조에 대한 설명이 대형에 관해서 MVC 패턴, 앱 팩토리, 서비스 및 데이터 마이그레이션과 같은 웹 앱 (가장 흥미로운 기능인 IMHO)이 있습니다.

2

나는 플라스크 응용 프로그램을 처음부터 yapper을 만들어 모두 프론트 엔드와 백엔드 개발을위한 꿀꺽로 통합했다. 간단한 블로그 엔진이지만 요구 사항에 따라 쉽게 수정할 수 있습니다. 청사진을 사용하여 잘 구성되어 있습니다.

체크 아웃 프로젝트 페이지 yapper

2

나는 플라스크 위에 구축 된 소셜 네트워크에했다. 내 프로젝트의 특별한 점은 서버가 순수하게 API 엔드 포인트를 제공하고 프론트 엔드가 한 페이지 백본 앱이라는 것입니다. 내가했다 플라스크 구조는 다음과 같다 :

├── app │ ├── api
│ │ ├── auth.py │ │ └── ... │ ├── app.py │ ├── common │ │ ├── constants.py │ │ ├── helpers.py │ │ ├── response.py │ │ └── ... │ ├── config.py │ ├── extensions.py │ ├── frontend │ │ └── controllers.py │ ├── static │ │ └── ... │ ├── templates │ │ ├── app.html │ │ └── ... │ └── users │ ├── UserConstants.py │ ├── UserForms.py │ ├── UserHelpers.py │ ├── UserModels.py │ └── __init__.py ├── alembic | ├── version │ └── ... ├── tests │ └── ...

당신은 내가 주제 here에 쓴보다 깊이있는 글을 읽을 수 있습니다. 다른 기능 영역을 자체 폴더로 구분하는 것이 훨씬 직관적 인 것으로 나타났습니다.

나는 얼마 전에 코드를 작업했고 완전히 열어 보았습니다! 당신은 그것을 밖으로 확인할 수 있습니다 on github.

+0

감사합니다. 좋은데. – daniels

관련 문제