Tách lượt xem trong một số tệp


153

Của tôi views.pyđã trở nên quá lớn và thật khó để tìm đúng quan điểm.

Làm thế nào để tôi chia nó trong một số tập tin và sau đó nhập nó? Nó có liên quan đến bất kỳ mất tốc độ?

Tôi có thể làm tương tự với models.py?


4
Tôi chia tệp view.txt (7k dòng) lớn của mình thành các tệp riêng biệt và tốc độ tăng là rất đáng kể.
1261774

Câu trả lời:


190

Trong Django, mọi thứ đều là mô-đun Python (* .py). Bạn có thể tạo thư mục chế độ xem với __init__.pybên trong và bạn vẫn có thể nhập chế độ xem của mình, vì điều này cũng thực hiện mô-đun Python. Nhưng một ví dụ sẽ tốt hơn.

Bản gốc của bạn views.pycó thể trông như thế này:

def view1(arg):
    pass

def view2(arg):
   pass

Với cấu trúc thư mục / tệp sau đây, nó sẽ hoạt động giống nhau:

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

Giải thích nhanh sẽ là: khi bạn viết from views import view1Python sẽ tìm view1 trong

  1. views.py, đó là những gì xảy ra trong trường hợp đầu tiên (bản gốc)

  2. views/__init__.py, đó là những gì xảy ra trong trường hợp thứ hai. Ở đây, __init__.pycó thể cung cấp phương thức view1 vì nó nhập nó.

Với loại giải pháp này, bạn có thể không cần phải thay đổi importhoặc urlpatterns đối số trongurls.py

Nếu bạn có nhiều phương thức trong mỗi tệp xem mới, bạn có thể thấy hữu ích khi nhập dữ liệu đang views/__init__.pysử dụng *, như thế này:

from viewsa import *
from viewsb import *

Tôi thực sự không biết về các vấn đề tốc độ (nhưng tôi nghi ngờ có bất kỳ vấn đề nào).

Đối với Mô hình, nó có thể là một chút khó khăn.


2
Bạn có thể vui lòng thêm một mẫu url phù hợp với view1 hoặc view2 trong ví dụ của bạn không? Bởi vì tôi có vấn đề với điều đó ....
Pascal Klein

2
Tôi đã thử làm điều này, nhưng khi tôi đi nhập các mô hình của mình (từ app.models nhập MyModel hoặc từ các mô hình nhập MyModel) Python phàn nàn rằng mô hình không tồn tại.
Chris Miller

Có ổn không nếu chúng ta xóa lượt xem trong thư mục gốc?
Roel

6
Giải pháp này không hiệu quả với tôi (cùng một lỗi so với @ChrisMiller. Giải pháp của tôi: in __init__.py: from myapp.views.viewsa import *. Lưu ý rằng bạn không thể có view.txt nữa (hoặc ít nhất là nó sẽ không được đọc @ShiftNTab: Lỗi vì không tìm kiếm quan điểm của bạn trong lượt xem). Hy vọng điều đó có ích!
ThePhi

Điều gì về quy ước đặt tên: tên tệp nên là số ít hoặc số nhiều? Ví dụ: views.car.pyvsviews.cars.py
guival

21

Tôi đã phải làm điều này trước đây (vì rõ ràng)

Cách tôi đã làm là tạo một viewsthư mục, sau đó, trong đó, tạo một tệp có tên__init__.py

Bây giờ, khi bạn gọi đến urls.py, bạn chỉ cần thêm một phần khác

Ví dụ: trước đây, bạn có thể đã gọi: -

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')

Bây giờ bạn có thể gọi một cái gì đó dọc theo dòng

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')

Tất nhiên, điều này là giả sử rằng bạn đã views/year.pychứa các hàm indexuser;)


10

Về cơ bản, bạn có thể đặt mã của mình, bất cứ nơi nào bạn muốn. Chỉ cần đảm bảo, bạn thay đổi báo cáo nhập cho phù hợp, ví dụ: cho các chế độ xem trongurls.py .

Không biết mã thực tế của bạn thật khó để đề xuất một cái gì đó có ý nghĩa. Có lẽ bạn có thể sử dụng một số loại tiền tố tên tập tin, ví dụ như views_helper.py, views_fancy.py, views_that_are_not_so_often_used.pyhoặc lâu hơn ...

Một lựa chọn khác sẽ được tạo ra một viewsthư mục với một __init__.py, nơi bạn nhập tất cả các subviews . Nếu bạn có nhu cầu về số lượng lớn tệp, bạn có thể tạo các cuộc phỏng vấn lồng nhau hơn khi lượt xem của bạn tăng lên ...


8

Chỉ để chia sẻ, tôi có một chút vấn đề với câu trả lời của Vincent Demeester. Mọi thứ đều ổn ngoại trừ trong tệp init .py, tôi phải viết theo cách này:

__init__.py :

from .viewsa import *
from .viewsb import *

Bằng cách này, tôi vẫn không cần thay đổi importphương thức của mình trong url. Tôi đang dùng Python 3.6.1Django 1.11.4 .


5

Câu trả lời đơn giản: Có.

Tốt nhất là tạo một thư mục có tên là lượt xem và sau đó trong url của bạn làm:

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

1

Tôi chia gần như tất cả các lượt xem trong ứng dụng của mình thành một thư mục lượt xem ( dĩ nhiên là có init .py). Tuy nhiên, tôi không nhập tất cả các cuộc phỏng vấn trong init .py như một số câu trả lời đã đề xuất. Nó dường như chỉ hoạt động tốt.


1

Vì Django chỉ mong muốn một khung nhìn là một đối tượng có thể gọi được, nên bạn có thể đặt bất cứ nơi nào bạn muốn trong PYTHONPATH của bạn. Vì vậy, bạn có thể chỉ cần tạo một gói mới myapp.view và đặt các khung nhìn vào nhiều mô-đun ở đó. Bạn đương nhiên sẽ phải cập nhật urls.py và các mô-đun khác tham chiếu các chế độ xem này.


1
Điều này thực sự không chính xác - nó có thể được thực hiện với các mô hình. Xem: code.djangoproject.com/ticket/4470
Jonathan Berger

1
À, thật tốt khi biết, cảm ơn bạn :-) Tôi luôn nghĩ rằng có thêm một chút phép thuật liên quan đến các mô hình và cách chúng sống trong gói ứng dụng. Đã xóa dòng về các mô hình trong phản ứng của tôi.
Horst Gutmann

Vui mừng tôi có thể giúp, sau đó tôi nhận ra rằng liên kết này thực sự giải thích cách nó được thực hiện với các mô hình tốt hơn nhiều: blog.amber.org/2009/01/19/ Khăn
Jonathan Berger

1

Tôi đã chơi với việc đưa cái này vào init .py của tôi :

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))

Tôi vẫn chưa quen với python, vì vậy tôi vẫn đang xem nó có ảnh hưởng gì đến tốc độ / bảo mật / dễ sử dụng.


1

Giả sử nếu bạn có một tệp có tên: password_generator.pythì bên trong views.pyadd:from password_generator import *

Sau đó, bạn có thể gọi chức năng của mô-đun đó từ views.py.


1

Câu trả lời của Vincent Demeester là tuyệt vời! nhưng đối với tôi câu trả lời của người nghiện làm việc như một cơ duyên. Tôi gặp khó khăn trong việc di chuyển cơ sở dữ liệu. Lỗi chỉ ra dòng nơi mô hình đầu tiên được nhập và nói không thể nhận ra mô-đun ứng dụng của tôi. Tìm kiếm rất nhiều nhưng không thể tìm ra giải pháp nhưng sau đó tôi đã nhập mô hình như thế này:

from ..models import ModelName

Nó đã làm việc!!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.