development

여러 파일로 views.py 분할

big-blog 2020. 6. 17. 07:41
반응형

여러 파일로 views.py 분할


views.py것이 너무 커져서 올바른 견해를 찾기가 어렵습니다.

여러 파일로 분할 한 다음 가져 오려면 어떻게합니까? 속도 손실이 있습니까?

내가 똑같이 할 수 있습니까 models.py?


장고에서는 모든 것이 파이썬 모듈 (* .py)입니다. __init__.py내부가 있는보기 폴더를 만들 수 있으며 여전히 파이썬 모듈을 구현하기 때문에보기를 가져올 수 있습니다. 그러나 예가 더 좋습니다.

원본 views.py은 다음과 같습니다.

def view1(arg):
    pass

def view2(arg):
   pass

다음 폴더 / 파일 구조를 사용하면 동일하게 작동합니다.

views/
   __init__.py
   viewsa.py
   viewsb.py

viewsa.py :

def view1(arg):
    pass

viewsb.py :

def view2(arg):
    pass

__init__.py :

from viewsa import view1
from viewsb import view2

빠른 설명은 다음과 같습니다 당신이 쓸 때 from views import view1파이썬에서 뷰 1을 찾습니다

  1. views.py첫 번째 (원래) 사례에서 발생하는 것입니다.

  2. views/__init__.py이는 두 번째 경우에 발생합니다. 여기 __init__.py에서 view1 메소드를 가져 오기 때문에 제공 할 수 있습니다.

이러한 유형의 솔루션으로, 당신은 변경할 필요가 없습니다 수 import또는 urlpattern에서 인수를이야urls.py

각각의 새보기 파일에 많은 메소드가있는 경우 다음 과 같이 가져 오기를 views/__init__.py사용 하는 것이 유용 할 수 있습니다 *.

from viewsa import *
from viewsb import *

나는 실제로 속도 문제에 대해 알지 못합니다 (그러나 나는 의심합니다).

모델의 경우 약간 어려울 수 있습니다.


전에이 작업을 수행해야했습니다 (명확성을 위해).

내가 한 방법은 views디렉토리를 만든 다음 그 안에 파일을 만듭니다.__init__.py

이제을 (를) 호출 할 때 urls.py다른 부분을 추가하기 만하면됩니다.

예를 들어, 이전에 다음을 호출했을 수 있습니다.

url(r'^calendar/(?P<year>\d\d\d\d)/$', 'myproject.calendar.views.year')
url(r'^calendar/(?P<year>\d\d\d\d)/(?P<user>[a-z]+)/$', 'myproject.calendar.views.year_by_user')

이제 라인을 따라 뭔가를 호출 할 수 있습니다

url(r'^calendar/(?P<year>\d\d\d\d)/$', 'myproject.calendar.views.year.index')
url(r'^calendar/(?P<year>\d\d\d\d)/(?P<user>[a-z]+)/$', 'myproject.calendar.views.year.user')

물론 이것은 views/year.py함수를 포함하고 있다고 가정 index하고 user;)


기본적으로 원하는 곳에 코드를 넣을 수 있습니다. 예를 들어의 뷰에 대해 import 문을 적절히 변경하십시오 urls.py.

실제 코드를 모르면 의미있는 것을 제안하기가 어렵습니다. 어쩌면 당신은 예를 들어 파일 이름 접두어, 어떤 종류의 사용할 수 있습니다 views_helper.py, views_fancy.py, views_that_are_not_so_often_used.py정도를 ...

또 다른 옵션은을 사용하여 views디렉토리 를 작성하는 것 입니다. __init__.py여기서 모든 하위보기 를 가져옵니다 . 많은 수의 파일이 필요한 경우 뷰가 증가함에 따라 중첩 된 하위 뷰를 더 만들 수 있습니다 ...


공유하기 위해 Vincent Demeester의 답변에 약간의 문제가있었습니다. init .py 파일을 제외하고는 모든 것이 좋습니다.이 방법으로 작성해야합니다.

__init__.py :

from .viewsa import *
from .viewsb import *

이렇게하면 여전히 importurls.py에서 메소드 를 변경할 필요가 없습니다. 저는 Python 3.6.1Django 1.11.4에 있습니다.


간단한 대답 : 그렇습니다.

가장 좋은 방법은 views라는 디렉토리를 만든 다음 urls.py에서 수행하는 것입니다.

import views
...
url(r'^classroom$', views.school.klass, name="classroom"),

내 응용 프로그램의 거의 모든 뷰를 뷰 폴더로 분할합니다 ( 물론 init .py 사용). 그러나 일부 답변이 제안한 것처럼 init .py 의 모든 하위 뷰를 가져 오지 않습니다 . 잘 작동하는 것 같습니다.


Since Django just expects a view to be a callable object, you can put then wherever you like in your PYTHONPATH. So you could for instance just make a new package myapp.views and put views into multiple modules there. You will naturally have to update your urls.py and other modules that reference these view callables.


I've been playing with putting this in my init.py:

import os

currPath = os.path.realpath(os.path.dirname(__file__))

dirFiles = []
for root, dirs, files in os.walk(currPath):
    for name in files:
        if name.endswith('.py') and not name.startswith('_'): 
            dirFiles.append(name.strip('.py'))

for f in dirFiles:
    exec("from %s import %s" % (f,f))

I'm still new to python, so I'm still looking at what effect it has on speed/security/ease of use.


Suppose if you have a file named: password_generator.py then inside views.py add: from password_generator import *

Then you can call that module's function from views.py.

참고URL : https://stackoverflow.com/questions/1921771/split-views-py-in-several-files

반응형