質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1713閲覧

views.pyに書いてある長いメソッドを切り出したい

bapasu

総合スコア11

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/04/09 12:24

views.pyに書いてある長いメソッドを切り出したいです。
現在、views.pyに

def test1(request): return HttpResponse('<h1>Test1</h1>') def test2(request): return HttpResponse('<h1>Test2</h1>') def test3(request): return HttpResponse('<h1>Test3</h1>') def test4(request): return HttpResponse('<h1>Test4</h1>') def test5(request): return HttpResponse('<h1>Test5</h1>') def test6(request): return HttpResponse('<h1>Test6</h1>') def test7(request): return HttpResponse('<h1>Test7</h1>') def test8(request): return HttpResponse('<h1>Test8</h1>') def test9(request): return HttpResponse('<h1>Test9</h1>') def test10(request): return HttpResponse('<h1>Test10</h1>') def test11(request): return HttpResponse('<h1>Test11</h1>')

と書いてあります。このコードが長いのでこの内容をそっくりそのままmethod.pyに書き写しました。そしてそれをurls.pyとひもづけたいです。
urls.pyには

from django.conf.urls import path from . import views urlpatterns = [ path('test1', views.test1, name='test1'), path('test2', views.test2, name='test2'), ・       ・       ・ path('test10', views.test10, name='test10'), path('test11', views.test11, name='test11'), ]

と書いてあります。method.pyに切り出したメソッドをurls.pyに紐付け、views.pyから表示させるにはどういうコードをviews.pyとurls.pyに書けば良いでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

複数の方法があるような気がします。自分はPythonのモジュール・パッケージ・インポートの仕組みを把握しきれてないので、ベストプラクティスはわかりませんが、ありえる一つの方法のみコメントしてみます。

元々views.pyにあった名前があたかもviews.pyに定義されているかのように扱え、実際は別のソースファイルへ書いておきたいという場合、

views.pyと同じディレクトリーへmethods.pyを置きviews.pyに定義していた一部の名前をmethods.pyへ移動し、views.pyの先頭に

from .methods import *

と書いておけば、methodsモジュール上の全ての名前(※)がviewsモジュールへインポートされますのでそれ以外の修正(urls.pyの変更など)は不要になると思います。

試しに次のようにすると期待通り動くように見えました。

main.py + foo + urls.py + views.py + methods.py

main.py

Python

1import foo/urls.py

foo/urls.py

python

1import views.py 2views.test1()

foo/views.py

python

1from .methods import * 2# 元々はtest1はここに定義していたものとする

foo/methods.py

python

1def test1(): 2 print('test1')

上記でpython main.pyを動かすと'test1'がprintされました。

※:全ての名前
アンダースコアで始まる名前についてどういう振る舞いになるか自分もはっきりわかってませんが、本件ではそれは問題にならないと思いました。

投稿2018/04/09 15:32

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bapasu

2018/04/10 07:49

ありがとうございます。from .methods import * の.methodsの.はどうして必要なのでしょうか?from methods import * ではダメなのでしょうか?
KSwordOfHaste

2018/04/10 08:23

そこらへん自分も正確に分かってません。最初自分も from method import * と書きましたが、うまくいかず、 https://docs.python.org/ja/3/reference/import.html https://docs.python.org/ja/3/reference/simple_stmts.html#the-import-statement あたりを見ていたのですが、それらを読破する前に .methodと記述すると動くという事実がわかったというのが正直なところです。曖昧なことしか言えずすみません。
bapasu

2018/04/10 08:36

いえいえ、ありがとうございます!!ちなみに、foo/views.py にはfrom .methods import * のみが書いてあるということでしょうか?
KSwordOfHaste

2018/04/10 08:43

そうです。回答に書いたソースはimportの働きを確認する目的のみに絞って書いてます。一応完全なソースです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問