backend/django

django tutorial: advanced- 앱 재사용하기

seul chan 2017. 3. 4. 00:07

https://docs.djangoproject.com/en/1.10/intro/reusable-apps/

    

우리는 만들어진 poll 앱을 standalone 파이썬 패키지로 만들어서 다른 프로젝트에 쓸 수 있게 할 것이다.


**Reusability matters


웹 애플리케이션을 디자인하고 만들고 테스트하고 유지하는 것은 많은 노력이 필요하다.

많은 파이썬, 장고 프로젝트는 같은 문제를 공유한다.

몇몇을 저장하고 다시 사용하면 좋지 않을까?


'Reusability' is the way of life in Python

Pypi는 파이썬 프로그램에서 사용할 수 있는 방대한 파이썬 패키지들을 제공한다.

Django Packages(https://djangopackages.org/)에는 프로젝트에 맞는 다양한 재사용 가능한 앱들이 있다.

이 말은, 존재하는 파이썬 패키지와 장고 앱들을 자신의 웹 프로젝트에 맞게 사용할 수 있다는 것이다. 


당신이 새로운 프로젝트를 시작하고 polls 앱이 필요하다고 해보자. 

어떻게 재사용할 것인가?

다행히도, 이미 ㅌ튜토리얼 3에서 우리는 이 방법을 사용해봤다.

우리는 include를 사용해 project-level-URLconf에서 polls을 분리시켰다. 

이 튜토리얼에서, 우리는 새로운 프로젝트에 쉽게 앱을 사용할 수 있는 방법을 보겠다.


# Package? App?

파이썬 패키지는 연결된 파이썬 코드들을 재사용하기 쉽게 묶어 제공한다. 이 패키지는 modules로 불리는 많은 코드들을 포함한다.

패키지는 import foo.bar 이나 from foo import bar 방식으로 불러올 수 있다.

polls과 같이 패키지를 형성하는 디렉토리는, __init__.py라는 특수한 형태의 파일이 필요하다. (파일이 비어있을지라도)


장고 어플리케이션은 장고 프로젝트에 사용하도록 특별히 의도된 파이썬 패키지이다. 

어플리케이션은 models, tests, urls, views 서브모듈들을 가진 흔한 장고 컨벤션이다. (?)


나중에 우리는 'packaging'이라는 용어를 다룰 것이다

=> 이는 파이썬 패키지를 좀 더 쉽게 설치할 수 있도록 한 것



**Your project and your reusable app


앞의 튜토리얼을 마친 후, 우리의 프로젝트는 다음과 같은 tree를 가진다

---------------

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

---------------

앞서 mysite2_project/templates 를 만들었고, polls/templates을 만들었다. 

왜 우리가 프로젝트와 앱에서 templates 디렉토리를 나눴는지 이제 확실해졌을 것이다

=> 애플리케이션의 self-contained가 새 프로젝트에 옮기기 쉽다


polls 디렉토리는 새 장고 프로젝트에 복사하여 바로 사용할 수 있다.

하짐나 이는 아직 배포되기에는 부족하다. 

이를 위해서 우리는 다른 사람이 설치할 수 있도록 앱을 package하여야한다.



**Installing some prerequisites


현재 파이썬 패키징은 다양한 툴로 뒤죽박죽이다. (??)

이번 튜토리얼에서는 setuptools(https://pypi.python.org/pypi/setuptools)을 사용하여 패키지를 만들 것이다. 

setuptools은 distribute fork와 합쳐진 패키징 툴이다. pip를 사용하여 설치/제거 가능하다.

2가지의 패키지를 지금 설치해야 한다. 도움이 필요하면 how to install Django with pip(https://docs.djangoproject.com/en/1.10/topics/install/#installing-official-release)를 참고하여 setuptools도 똑같이 설치하면 된다

                                                              

# Python 3.4 이상의 버전이 설치되어 있다면 이미 pip와 setuptools이 설치되어 있다

업그레이드 하면 됨

$ pip install -U pip setuptools                                                              



**Packaging your app


파이썬 패키징은 앱을 쉽게 설치하고 사용할 수 있도록 특별히 포멧하는 것을 의미한다.

장고는 그렇게 자체적으로 패키지 되어있다. poll과 같이 작은 앱은 어렵지 않다.


1. 우선, 장고 프로젝트의 바깥에 polls의 parent directory를 만든다. 

이 디렉토리를 django-polls라고 부른다.


# 앱을 위한 이름 선택하기

Pypi같은 리소스를 확인하고 이미 존재하는 패키지와 이름의 혼란을 피해얗ㄴ다.

때로는 django- 와 같은 모듈 네임을 붙이는게 유용

=> 해당 앱이 장고에 특화되어 있다는 것을 알려줌


어플리케이션 라벨(어플리케이션 패키지의 마지막 dotted path??)는 INSTALLED_APPS 안에서 유일해야한다.

Django contrib packages와 같은 라벨을 갖지 않도록 피해라

(auth, admin, messages 등... - (https://docs.djangoproject.com/en/1.10/ref/contrib/) 참고)


2. polls 디렉토리를 django-polls 디렉토리로 옮겨라

cp -r 원본폴더 복사할폴더 # 이 명령어로 폴더를 통째로 옮길 수 있다.

$cp -r polls ../django-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 파일을 만들어라. 

라이센스를 선택하는 것은 이 튜토리얼의 범위를 벗어난다. 

하지만 라이센스가 없이 배포되는 것은 쓸모없다(?)

장고나 다른 많은 장고 앱들은 BSD 라이센스 아래서 배포된다.

하지만 자신의 라이센스 선택은 자유이다. 다만 라이센스의 선택은 누가 당신의 코드를 사용하는지에 영향을 미친다는 것을 기억하라.

                     

5. setup.py 파일을 만들어라

어떻게 앱을 설치할 것인지 디테일을 제공해준다.

완벽한 설명은 튜토리얼의 범위를 벗어나니 setuptools docs(https://setuptools.readthedocs.io/en/latest/)를 참고해라                     

-----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. 패키지에는 디폴트로 단지 Python 모듈과 패키지만 포함되어 있다

추가적인 파일을 포함하기 위해서 MANIFEST.in 파일을 만들어야한다.

setuptools docs에서 더 디테일하게 다룬다

템플릿을 포함하기 위해서 README.rst와 LICENSE 파일, 그리고 MENIFEST.in 파일을 다음과 같이 만들어라

----django-polls/MANIFEST.in------

include LICENSE

include README.rst

recursive-include polls/static *

recursive-include polls/templates *                     

-----------------------------------


7. 옵션으로 (하지만 하기를 추천한다) 앱의 디테일 문서들을 추가해라.

앞으로의 documentation 추가를 위해 django-polls/docs 폴더를 만들어라

그리고 MANIFEST.in 파일에 다음을 추가해라

------------

recursive-include docs *                     

------------                     

그곳에 파일을 넣지 않으면 패키지에 포함되지 않는다. 많은 장고 앱들은 다큐멘트를 온라인으로 제공한다.

                     

8. python setup.py sdis를 통해 패키지를 만들어라

-django-polls 디렉토리 안에서 실행하여야 한다.

이는 dist라는 디렉토리를 만들고, django-polls-0.1.tar.gz라는 새로운 패키지를 만든다.


더 많은 정보는 Tutorial on Packaging and Distributing Projects.(https://packaging.python.org/distributing/)참고

           


**Using your own package


polls 디렉토리를 프로젝트에서 옮겼기 때문에 작동하지 않는다.

(아까 위에선 cp를 통해 복사를 했지만 mv를 통해 옮기면 사라진다. 튜토리얼을 위해 polls 폴더를 지웠다)

이를 고치기 위해서 새로운 django-polls 패키지를 설치해보자


# installing as a user library

다음 스텝들은 django-polls를 user library를 설치한다. 

Per-user 설치는 system-wide 설치 방식보다 많은 장점을 갖는다. (??)- 시스템 서비스에 영향을 미치지 않고도 사용할 수 있는 등?

그래도 per-user 설치 또한 user에 따라 시스템에 영향을 미치기 때문에 virtualenv가 더 좋은 솔루션이다


1. pip를 활용해서 패키지를 설치하라

$pip install --user django-polls/dist/django-polls-0.1.tar.gz


2. with luck, 장고 프로젝트는 잘 운영될것이다 (?) 서버를 켜봐라


3. 지우기 위해서도 pip를 사용하라

$pip uninstall django-polls



*문제: 


-advanced tutorial: polls 앱 설치하기 오류

pip를 통해 설치되면 완료되었다고 뜨지만, 설치가 안된거같다.

runserver를 해봐도 no module named 'polls'라고 뜬다.


해결책1. 메인 폴더의 settings.py안 INSTALLED_APPS의 'polls.apps.PollsConfig'를 polls로 변경해보기 (http://stackoverflow.com/questions/32785902/django-reusable-apps-tutorial-importerror-no-module-named-polls) 

=> 그대로

아직 해결되지 못함..

나중에 새로운 프로젝트에 설치해서 해봐야겠다.