심화 튜토리얼: 재사용 가능한 앱을 만드는 법

이 심화 튜토리얼은 Tutorial 7의 완료 지점에서 시작합니다. 우리를 이제 우리의 Web-poll을 새 프로젝트에서 재사용하거나 다른사람들과 공유할수있는 독립적인 파이썬 패키지로 만들것입니다.

아직 튜토리얼 1-7을 완료하지 않았다면 이를 리뷰해서 당신의 예제 프로젝트가 아래에 설명하는것과 일치되도록 하기를 권장합니다.

재사용성의 문제들

웹 어플리케이션을 설계, 빌드, 테스트와 관리는 꽤나 큰 일입니다. 많은 파이썬 그리고 Django 프로젝트들은 공통의 문제를 공유합니다. 만약 우리가 이 반복적인 작업들중에서 몇몇을 구해낼수 있다면 정말 멋지지 않을까요?

재사용 성은 파이썬에서 삶의 방식입니다. `Python 패키지 색인 (PyPI) <https://pypi.python.org/pypi>`_은 당신 자신의 파이썬 프로그램에서 사용할 수있는 방대한 패키지를 가지고 있습니다. 프로젝트에 통합 할 수있는 기존의 재사용 가능한 응용 프로그램에 대해서는`Django Packages <https://djangopackages.org>`_를 확인하십시오. Django 자체도 파이썬 패키지입니다. 즉, 기존의 Python 패키지 또는 Django 앱을 가져 와서 자신의 웹 프로젝트 로 구성 할 수 있습니다. 프로젝트 를 고유하게 만드는 부분 만 작성하면됩니다.

이제 우리가 작업했던 것과 같은 설문 조사 앱이 필요하여 새로운 프로젝트를 시작했다고 가정해봅시다. 어떻게 이 앱을 재사용할 수 있게 만들 수 있을까요? 운 좋게도, 여러분은 이미 방법을 알고 있습니다. Tutorial 3 에서, 우리는 include를 이용하여 프로젝트 수준의 URLconf에서 설문조사를 분리하는 방법을 봤습니다. 이 튜토리얼에서는, 새로운 프로젝트에서 사용하기 쉬운 앱을 만들기 위해, 설치하고 사용할 다른 사람들을 위해 게시할 준비를 하기 위해 추가적인 작업을 할 것입니다.

패키지? 앱?

Python package 는 쉽게 재사용하기 위해 연관된 Python 코드를 묶어놓은 것입니다. package 는 Python 코드가 들어있는 하나 이상의 파일들이 포함되어 있으며, 이를 "module" 이라고도 합니다.

import foo.barfrom foo import bar 로 패키지를 import 할 수 있습니다. 디렉토리(polls와 같은)는 패키지를 형성하기 위해, 특별한 파일 __init__.py를 포함하고 있습니다, 그 파일이 빈파일일 경우에도 포함하고 있습니다.

Django 애플리케이션은 Django 프로젝트에 사용하기 위한 파이썬 패키지일 뿐입니다. 애플리케이션은 models, tests, urls, views 서브모듈들을 포함하고 있는 공통적인 Django 규칙을 이용할 수 있습니다.

나중에 우리는 다른사람들이 쉽게 파이썬 패키지를 설치하는 과정을 설명하기 위해 패키징 기능을 사용할 것입니다. 조금 혼란스러울 수도 있습니다.

프로젝트와 재사용가능한 앱

이전 프로젝트를 마치면, 프로젝트는 아래와 같을 것입니다:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    polls/
        __init__.py
        admin.py
        migrations/
            __init__.py
            0001_initial.py
        models.py
        static/
            polls/
                images/
                    background.gif
                style.css
        templates/
            polls/
                detail.html
                index.html
                results.html
        tests.py
        urls.py
        views.py
    templates/
        admin/
            base_site.html

여러분은 튜토리얼 7 에서 mysite/templatesTutorial 3 에서 polls/templates 를 생성하였습니다. 이제 프로젝트와 어플리케이션으로 분리한 이유가 명확합니다. polls 어플리케이션의 부분들은 polls에 모두 있습니다. It makes the application self-contained and easier to drop into a new project.

polls 디렉토리가 이제 새 Django 프로젝트로 복사되었고, 바로 재사용할 수 있습니다. 그래도 게시 할 준비가 되지 않았습니다. 이를 위해, 다른 사람들이 쉽게 설치할 수 있도록 앱을 패키지화해야합니다.

필수 구성 요소 설치

파이썬 패키징의 현재상태는 다양한 도구들로 인해 약간 혼란스럽습니다. 이 튜토리얼에서, 우리의 패키지를 빌드하는데 setuptools 를 사용할 것입니다. 권장 패키징 도구(distribute 포크와 병합된)입니다. 설치하고 재설치하는데 pip 를 사용할 수도 있습니다. 이제 이 두 패키지들을 설치해야합니다. 도움이 필요하면 pip로 Django 설치하는 법 을 참조할 수 있습니다. 같은 방법으로 setuptools 도 설치할 수 있습니다.

앱 패키징하기

파이썬 패키징 은 쉽게 설치하고 사용할 수 있는 특별한 형식으로 앱을 준비하는 것을 의미합니다. 장고 자체도 이와 같이 패키지화되어 있습니다. 설문조사처럼 작은 앱은 이 과정이 어렵지 않습니다.

  1. 먼저, Django 프로젝트 외부에 polls 의 상위 디렉토리를 만듭니다. 이 디렉토리를 django-polls라 부르겠습니다.

    앱 이름 선택

    패키지 이름을 선택할 때, 기존 패키지들과 충돌을 피하기 위해 PyPI 같은 리소스들을 점검하세요. 배포할 패키지를 생성할 때, 모듈 이름 앞에 django- 를 앞에 붙이는 것이 좋습니다. 이러면 Django 앱을 찾는 다른 사용자가 여러분의 앱을 Django 고유 앱으로 인식하는데 도움이 됩니다.

    애플리케이션 라벨들(즉, 애플리케이션 패키지들의 경로의 가장 마지막부분)은 INSTALLED_APPS 에서 고유해야합니다 . auth, admin, or messages 같은 Django contrib packages 와 같은 라벨을 사용하지 마세요.

  2. django-polls 디렉토리의 polls 디렉토리로 이동하세요.

  3. 다음과 같은 내용으로 django-polls/README.rst를 생성합니다:

    django-polls/README.rst
    =====
    Polls
    =====
    
    Polls is a simple Django app to conduct Web-based polls. For each
    question, visitors can choose between a fixed number of answers.
    
    Detailed documentation is in the "docs" directory.
    
    Quick start
    -----------
    
    1. Add "polls" to your INSTALLED_APPS setting like this::
    
        INSTALLED_APPS = [
            ...
            'polls',
        ]
    
    2. Include the polls URLconf in your project urls.py like this::
    
        url(r'^polls/', include('polls.urls')),
    
    3. Run `python manage.py migrate` to create the polls models.
    
    4. Start the development server and visit http://127.0.0.1:8000/admin/
       to create a poll (you'll need the Admin app enabled).
    
    5. Visit http://127.0.0.1:8000/polls/ to participate in the poll.
    
  4. django-polls/LICENSE 파일을 생성합니다. 라이선스 선택은 이 튜토리얼의 범위를 벗어나므로, 라이선스 없이 공개된 코드는 쓸모없음 을 의미한다는 것만 말해두겠습니다. Django와 많은 Django 호환 앱들이 BSD 라이센스로 배포되고 있습니다; 그러나 자신의 라이센스를 자유롭게 선택할 수 있습니다. 라이선스 선택이 누군가 여러분의 코드를 사용하는데 영향이 미칠수 있다는 사실은 알고 있어야합니다.

  5. 다음에, 우리는 앱을 빌드하고 설치하는 방법에 대한 세부 사항을 제공하는 setup.py 파일을 생성 할 것입니다. 이 파일에 대한 전체적인 설명은 이 튜토리얼의 범위에서 벗어나지만, setuptools 문서 에 좋은 설명이 입습니다. 다음 내용으로 django-polls/setup.py 파일을 만드세요.

    django-polls/setup.py
    import os
    from setuptools import find_packages, setup
    
    with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as readme:
        README = readme.read()
    
    # allow setup.py to be run from any path
    os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir)))
    
    setup(
        name='django-polls',
        version='0.1',
        packages=find_packages(),
        include_package_data=True,
        license='BSD License',  # example license
        description='A simple Django app to conduct Web-based polls.',
        long_description=README,
        url='https://www.example.com/',
        author='Your Name',
        author_email='yourname@example.com',
        classifiers=[
            'Environment :: Web Environment',
            'Framework :: Django',
            'Framework :: Django :: X.Y',  # replace "X.Y" as appropriate
            'Intended Audience :: Developers',
            'License :: OSI Approved :: BSD License',  # example license
            'Operating System :: OS Independent',
            'Programming Language :: Python',
            # Replace these appropriately if you are stuck on Python 2.
            'Programming Language :: Python :: 3',
            'Programming Language :: Python :: 3.4',
            'Programming Language :: Python :: 3.5',
            'Topic :: Internet :: WWW/HTTP',
            'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
        ],
    )
    
  6. 기본적으로 파이썬 모듈들과 패키지들만 패키지에 포함되어 있습니다. 추가 파일을 포함 시키기위해선 MANIFEST.in 파일을 만들어야합니다. 이전 단계에서 나온 setuptools 문서에 이 파일에 대해 자세한 설명이 있습니다. 템플릿들, README.rst , 우리의 LICENSE 파일을 포함 시키려면, 다음 내용으로 django-polls/MANIFEST.in 파일을 만듭니다.

    django-polls/MANIFEST.in
    include LICENSE
    include README.rst
    recursive-include polls/static *
    recursive-include polls/templates *
    
  7. 선택사항입니다만, 자세한 문서를 포함시키는 것을 추천합니다. 장래의 문서들을 위해 django-polls/docs 라는 빈 디렉토리를 생성합니다. django-polls/MANIFEST.in 에 다음 한줄을 추가합니다:

    recursive-include docs *
    

    파일을 추가하지 않으면 docs 디렉토리는 패키지에 포함되지 않을 것입니다. 많은 Django 앱들이 readthedocs.org 같은 사이트들을 통해 온라인 문서를 제공합니다.

  8. python setup.py sdist 로 패키지를 빌드해보세요 (django-polls 내에서 실행). 이 명령은 dist 디렉토리를 생성하고, 새 패키지 django-polls-0.1.tar.gz 를 빌드합니다.

패키징에 대한 더 자세한 정보는 파이썬의 프로젝트 패키징 및 배포에 관한 튜토리얼 <https://packaging.python.org/distributing/>`을 참조하십시오.

여러분의 패키지 사용하기

우리가 polls 디렉토리를 프로젝트 바깥으로 이동했으므로, 작동하지 않을것입니다. 우리의 새 django-polls 패키지를 설치하여 이 문제를 해결할 것입니다.

유저 라이브러리 설치하기

다음 단계는 django-polls 를 사용자 라이브러리로 설치합니다. 사용자 단위 설치는 관리자권한 접근이 안되는 시스템 뿐만아니라 시스템 서비스나 다른 사용자들의 영향으로부터 패키지를 보호하는 것 같은 이점이 많습니다.

사용자 단위 설치는 해당 사용자로 실행되는 시스템 도구들의 동작에 영향을 미칠 수 있으므로, virtualenv 가 보다 강력한 솔루션입니다 (아래 참조).

  1. pip를 이용하여 패키지를 설치하세요(여러분은 이미 설치 하였습니다, 맞죠?):

    pip install --user django-polls/dist/django-polls-0.1.tar.gz
    
  2. 운이 따라준다면, 여러분의 Django 프로젝트는 이제 잘 작동할 것입니다. 확인해보기위해 서버를 다시 실행하세요.

  3. pip를 사용해 패키지를 삭제

    pip uninstall django-polls
    

앱 퍼블리싱

우리는 django-polls 를 패키지화하고 테스트했기에, 세계와 공유할 준비가 되었습니다. 단순한 예제가 아니면, 여러분은 이제 아래와 같은 것들을 할 수 있습니다:

virtualenv를 이용한 파이썬 패키지 설치하기

앞에서, 우리는 설문 조사 앱을 사용자 라이브러리로 설치했습니다. 여기에는 몇 가지 단점이 있습니다:

  • 사용자 라이브러리를 수정하면 시스템의 다른 파이썬 소프트웨어에 영향을 미칠 수 있습니다.
  • 이 패키지의 여러 버전 (또는 이름이 같은 다른 버전)을 실행할 수 없습니다.

일반적으로, 이러한 상황들은 여러가지 Django 프로젝트들을 관리할 때 발생합니다. 그런 경우, 최고의 해결책은 virtualenv 을 사용하는 것입니다. 이 도구는 각자의 라이브러리와 패키지 네임스페이스 복사본을 가진 격리된 파이썬 환경들을 관리할 수 있도록 해줍니다.

Back to Top