flask+sqlite实现登录注册
时间: 2023-07-27 14:06:10 浏览: 126
好的,下面是 Flask + SQLite 实现登录注册的简单示例:
首先,需要安装 Flask 和 SQLite3,可以使用以下命令:
```python
pip install flask
pip install pysqlite3
```
接着,创建一个 Flask 应用,包含以下文件:
```python
app.py # 应用主文件
database.py # 数据库操作文件
templates/ # HTML 模板文件夹
login.html # 登录页面
register.html # 注册页面
```
下面是 app.py 文件的示例代码:
```python
from flask import Flask, render_template, request, redirect, url_for, session
from database import create_user, login_user, get_user_by_username
app = Flask(__name__)
app.secret_key = 'your_secret_key'
@app.route('/')
def index():
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']
user = login_user(username, password)
if user is not None:
session['user_id'] = user['id']
return redirect(url_for('index'))
else:
error = 'Invalid username or password.'
return render_template('login.html', error=error)
else:
return render_template('login.html')
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
confirm_password = request.form['confirm_password']
if password != confirm_password:
error = 'Passwords do not match.'
return render_template('register.html', error=error)
user = get_user_by_username(username)
if user is not None:
error = 'Username is already taken.'
return render_template('register.html', error=error)
create_user(username, password)
return redirect(url_for('login'))
else:
return render_template('register.html')
@app.route('/logout')
def logout():
session.pop('user_id', None)
return redirect(url_for('login'))
if __name__ == '__main__':
app.run(debug=True)
```
在 app.py 中,我们导入了 Flask 和 session,创建了一个 Flask 应用,并设置了一个 secret_key,用于加密 session 数据。
接着,定义了三个路由:/login、/register 和 /logout。
/login 路由支持 GET 和 POST 请求。当收到 POST 请求时,从表单中获取用户名和密码,并使用 login_user 函数验证用户身份。如果验证通过,将用户 ID 存储在 session 中,并重定向到主页。如果验证失败,则显示错误消息。
/register 路由也支持 GET 和 POST 请求。当收到 POST 请求时,从表单中获取用户名和密码,并使用 create_user 函数创建新用户。如果用户名已存在或密码不匹配,则显示错误消息。
/logout 路由只支持 GET 请求。当收到 GET 请求时,从 session 中删除用户 ID,并重定向到登录页面。
下面是 database.py 文件的示例代码:
```python
import sqlite3
conn = sqlite3.connect('users.db')
cursor = conn.cursor()
def create_user(username, password):
cursor.execute('INSERT INTO users (username, password) VALUES (?, ?)', (username, password))
conn.commit()
def get_user_by_username(username):
cursor.execute('SELECT * FROM users WHERE username = ?', (username,))
row = cursor.fetchone()
if row is not None:
return {'id': row[0], 'username': row[1], 'password': row[2]}
else:
return None
def login_user(username, password):
user = get_user_by_username(username)
if user is not None and user['password'] == password:
return user
else:
return None
```
在 database.py 中,我们使用 SQLite3 数据库存储用户数据。定义了三个函数:
create_user:用于创建新用户。
get_user_by_username:用于根据用户名查找用户。
login_user:用于验证用户身份。
最后,我们需要创建一个 users.db 数据库文件,并创建一个名为 users 的表格,包含三个字段:id、username 和 password。
执行以下 SQL 命令:
```sql
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password TEXT NOT NULL
);
```
最后,我们需要在 templates 文件夹中创建两个 HTML 模板文件:login.html 和 register.html。
login.html:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
{% if error %}
<p>{{ error }}</p>
{% endif %}
<form method="POST">
<input type="text" name="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<button type="submit">Login</button>
</form>
<p>Don't have an account? <a href="{{ url_for('register') }}">Register</a></p>
</body>
</html>
```
register.html:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Register</title>
</head>
<body>
{% if error %}
<p>{{ error }}</p>
{% endif %}
<form method="POST">
<input type="text" name="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<input type="password" name="confirm_password" placeholder="Confirm Password" required>
<button type="submit">Register</button>
</form>
<p>Already have an account? <a href="{{ url_for('login') }}">Login</a></p>
</body>
</html>
```
这样,我们就完成了 Flask + SQLite 实现登录注册的示例。
阅读全文