下面是详细讲解"Python的Flask框架中实现简单的登录功能的教程"的完整攻略。
前置知识
在学习本教程之前,需要对以下技术有一定的了解:
- Python基础知识
- Flask框架基础知识
- HTML/CSS/JS基础知识
步骤一:准备
- 安装Python(建议使用3.6以上版本),并安装pip包管理工具。
- 通过pip安装Flask框架:
pip install Flask
- 创建一个文件夹作为项目文件,命名为flask-login,并在命令行进入该文件夹内。
- 在该文件夹内创建一个名为app.py的文件,并创建一个名为templates的文件夹。
步骤二:编写代码
1. 导入所需的模块
在app.py文件开头,导入所需的模块。
from flask import Flask, render_template, request, session, redirect, url_for
import os
2. 创建Flask实例
在导入所需模块后,创建Flask实例。
app = Flask(__name__)
3. 配置SESSION_KEY
为了加强安全性,需要给信息加密。为了实现这一点,我们需要配置SESSION_KEY。我们可以使用随机字符串来进行加密。
app.secret_key = os.urandom(24)
4. 确定主页路由
为主页设置路由,下面的例子为"/"。
@app.route('/')
def home():
if 'username' in session:
return render_template('home.html', username=session['username'])
return redirect(url_for('login'))
5. 确定登录路由
为登录设置路由,下面的例子为"/login"。这里我们期望用户填写用户名和密码,如果用户名和密码正确,则会存储会话和重定向到主页。
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if username == 'admin' and password == 'admin':
session['username'] = username
return redirect(url_for('home'))
return render_template('login.html')
6. 确定登出路由
为退出设置路由,下面的例子为"/logout"。在这里,会话会被清除,用户将被重定向到登录页面。
@app.route('/logout')
def logout():
session.pop('username', None)
return redirect(url_for('login'))
7. 编写HTML模板
最后,我们需要编写三个HTML模板:home.html、login.html和base.html。base.html是公共的HTML模板,可以由所有页面使用。login.html用于用户登录页面;home.html用于用户登陆后进入的主页面。
步骤三:运行程序
在命令行中,输入"python app.py",程序将运行在localhost:5000地址上。此时,在您的浏览器输入该地址,您应该可以看到一个简单的登录页面。 输入用户名admin和密码admin,您将被重定向到主页,您的用户名也应该显示在主页上。同时,单击"退出"按钮会使您退出并重新跳转到登录页面。
示例一:在本地文件中存储用户名和密码
在上面的例子中,我们使用了硬编码的用户名和密码。但是,在一个实际的应用程序中,用户名和密码通常存储在本地数据库或文件中。下面我们将阐述如何将用户名和密码存储在文件中。
- 创建一个文本文件,将其命名为users.txt,并将其保存在项目目录中。
- 在users.txt中添加如下条目
admin:adminpass
test:testpass
- 编写一些代码来读取users.txt文件,并将其存储为字典users。
def read_users():
users = {}
with open('users.txt') as f:
for line in f:
line = line.strip()
if not line:
continue
username, password = line.split(':')
users[username] = password
return users
users = read_users()
- 修改login路由的代码,从users字典中检索用户名和密码,并将会话存储到session中。
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if username in users and users[username] == password:
session['username'] = username
return redirect(url_for('home'))
return render_template('login.html')
请注意,我们将users字典作为全局变量存储,这不是一个很好的设计,但它演示了如何将用户名和密码存储在文件中,然后从文件读取。
示例二:使用数据库存储用户名和密码
在本示例中,我们将向您展示如何将用户名和密码存储在SQLite数据库中。我们将使用Python中的sqlite3模块来实现此功能。
- 通过pip安装sqlite3:
pip install sqlite3
- 在项目文件夹中创建一个名为flask-login.db的SQLite数据库文件。
- 在Python中,连接我们需要导入sqlite3模块并使用connect方法
import sqlite3
conn = sqlite3.connect('flask-login.db')
- 创建一个名为users的表,并将用户名和密码存储在其中。
def create_table():
with conn:
conn.execute('''CREATE TABLE IF NOT EXISTS users
(id INTEGER PRIMARY KEY,
username TEXT NOT NULL,
password TEXT NOT NULL);''')
conn.commit()
def add_user(username, password):
with conn:
conn.execute("INSERT INTO users(username, password) VALUES (?,?)", (username,password))
conn.commit()
create_table()
add_user('admin', 'adminpass')
add_user('test', 'testpass')
- 基于上面的修改,以下展示完整的代码。
from flask import Flask, render_template, request, session, redirect, url_for
import os
import sqlite3
app = Flask(__name__)
app.secret_key = os.urandom(24)
def create_table():
with conn:
conn.execute('''CREATE TABLE IF NOT EXISTS users
(id INTEGER PRIMARY KEY,
username TEXT NOT NULL,
password TEXT NOT NULL);''')
conn.commit()
def add_user(username, password):
with conn:
conn.execute("INSERT INTO users(username, password) VALUES (?,?)", (username,password))
conn.commit()
def read_user(username):
with conn:
cur = conn.execute("SELECT password FROM users WHERE username=?", (username,))
row = cur.fetchone()
if row:
return row[0]
return None
@app.route('/')
def home():
if 'username' in session:
return render_template('home.html', username=session['username'])
return redirect(url_for('login'))
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if read_user(username) == password:
session['username'] = username
return redirect(url_for('home'))
return render_template('login.html')
@app.route('/logout')
def logout():
session.pop('username', None)
return redirect(url_for('login'))
conn = sqlite3.connect('flask-login.db')
if __name__ == '__main__':
create_table()
add_user('admin', 'adminpass')
add_user('test', 'testpass')
app.run(debug=True)
结论
这两个示例是实现Flask框架中的简单登录功能的基本方法之一。第一个示例演示了在本地文件中存储用户名和密码;第二个示例演示了如何在Python中使用SQLite数据库存储用户名和密码。您可以使用这些示例代码来构建具有不同用途的登录功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python的Flask框架中实现简单的登录功能的教程 - Python技术站