🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

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

Python

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

Q&A

解決済

1回答

2587閲覧

django views.py の関数が呼ばれる前の前処理を実装したい

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

Python

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

0グッド

0クリップ

投稿2019/12/28 15:53

django で views.py の関数の前に前処理を入れたいのだが、どうすれば良いかわからない

今現在

def index(request): return render(request, 'hoge/index.html') // この hoge と hoge2、hoge3 の関数に入る前に、前処理を入れたい // ログインしていなかったら、ログイン画面にリダイレクトさせたい(session に user_id が無ければリダイレクトしたい) def hoge(request): return render(request, 'hoge/hoge.html') def hoge2(request): return render(request, 'hoge/hoge2.html') def hoge3(request): return render(request, 'hoge/hoge3.html') ↓ // 今現状このように書いています def hoge(request): if not 'user_id' in request.session: return redirecrt('/login') return render(request, 'hoge/hoge.html') def hoge2(request): if not 'user_id' in request.session: return redirecrt('/login') return render(request, 'hoge/hoge2.html') def hoge3(request): if not 'user_id' in request.session: return redirecrt('/login') return render(request, 'hoge/hoge3.html')

この hoge、hoge2、hoge3 で同じ処理を書いているので、それをまとめたいです。
Laravel ではコントローラーで前処理として、 __construct があると思うのですが、django でもこのような前処理を実装したい。

試したこと

この関数を class にまとめると、 __init__ と言う処理が使える?ようになる?とのことだと思いますが、 class にまとめる方法がわからず。。。

あと、ミドルウェアでの前処理も試しましたが、うまくいかず・・・
ミドルウェアで試したコード

from django.shortcuts import redirect class SimpleMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): if not 'user_id' in request.session: return redirecrt('/login')

こちらを試してみましたが、うまく行きませんでした。

どなたかわかるかたいましたら、ご教示願います。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ユーザーがログインしていなかったらログイン画面にリダイレクトさせたいということでしたら
login_requiredデコレータというものを使用します。

python

1from django.contrib.auth.decorators import login_required 2 3@login_required #デコレータ 4def my_view(request): 5 # ... 6
  • ユーザがログインしていなければ、 settings.LOGIN_URL に指定した値 (デフォル トでは /accounts/login/) にリダイレクトします。このとき、現在 のクエリの絶対 URL を next または redirect_field_name に 指定したパラメタの値に設定します。 URL は例えば /accounts/login/?next=/polls/3/ のようになります。

  • ユーザがログインしていれば、 ビューを普通に実行します。ビューコー ドの中では、ユーザがログインしているものとみなして構いません。

詳細はこちら
Django でのユーザ認証

投稿2019/12/29 12:32

tatamyiwathy

総合スコア1045

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

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

退会済みユーザー

退会済みユーザー

2019/12/30 00:49

tatamyiwathy 様 ご回答ありがとうございます! ユーザーがログインしていない時の実装はできました!(難しい・・・) これ以外に、view関数が呼び出される前に、処理が走る方法などはあったりするのでしょうか・・・?
退会済みユーザー

退会済みユーザー

2019/12/30 04:38

tatamyiwathy 様 「python decorator」で検索してこの記事が見つかり https://qiita.com/mtb_beta/items/d257519b018b8cd0cc2e 試したところ、できました! 既存関数の前後に自分で @deco という定義関数でデコレート処理を付け加えられるのですね。 勉強になりました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問