はじめに
URLのリンクは、これまでhref=”/login”など、リンクのパスを直接記載していた。
ただし、リンクのパスはアプリケーションの開発が進みにつれて変更になる可能性がある。
そのとき、色々な場所で指定しているリンクのパスを1つ1つ変更していっては面倒である。
そこで、今回はurl_forというメソッドを利用する。
直接リンクurl_forに置き換える
Url _forを使うと、直接リンク名ではなく、ビューに定義しているメソッド名を指定するだけで自動的に直接リンクに変換してくれる。
Views.pyの直接リンク名を指定している部分をurl_forに置き換えてみる。
from flask import request, redirect, url_for, render_template, flash, session
from flask_blog import app
@app.route('/')
def show_entries():
if not session.get('logged_in'):
return redirect(url_for('login'))
return render_template('entries/index.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
if request.form['username'] != app.config['USERNAME']:
flash('ユーザ名が異なります')
elif request.form['password'] != app.config['PASSWORD']:
flash('パスワードが異なります')
else:
session['logged_in'] = True
flash('ログインしました')
return redirect(url_for('show_entries'))
return render_template('login.html')
@app.route('/logout')
def logout():
session.pop('logged_in', None)
flash('ログアウトしました')
return redirect(url_for('show_entries'))
これまでredirect(‘/’)としていた部分がurl_for(‘show_entries’)に、redirect(‘/login)としていた部分をurl_for(‘login’)に変更。
layout.htmlのlogin、logoutリンクもurl_forに置き換える。
<!DOCTYPE html>
<title>Flask Blog</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<div class="container">
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="{{ url_for('show_entries') }}">Flask Blog</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav"
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="nav navbar-nav navbar-right">
{% if not session.logged_in %}
<li class="nav-item">
<a class="nav-link" href="{{ url_for('login') }}">ログイン</a>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link" href="{{ url_for('logout')}}">ログアウト</a>
</li>
{% endif %}
</ul>
</div>
</nav>
{% for message in get_flashed_messages() %}
<div class="alert alert-info" role="alert">
{{ message }}
</div>
{% endfor %}
<div class="blog-body">
{% block body %}{% endblock%}
</div>
</div>
最後に、login.htmlで指定しているloginリンクも置き換える。
{% extends "layout.html" %}
{% block body %}
<form action="{{ url_for('login')}}" method=post>
<div class="form-group">
<label for="InputTitle">ユーザ名</label>
<input type="text" class="form-control" id="InputTitle" name=username>
</div>
<div class="form-group">
<label for="InputPassword">パスワード</label>
<input type="password" class="form-control" id="InputPassword" name=password>
</div>
<button type="submit" class="btn btn-primary">ログイン</button>
</form>
{% endblock %}
これで、今後は直接リンク名の変更があった場合にも、url_forがリンク名とメソッドを自動的に紐付けてくれるようになった。
終わりに
次回はプログアプリケーションに必要なデータデータベースを設定し、使えるようにしていく。
コメント