写一个一个能进行登录、注册、留言的简易网站包括代码
时间: 2024-01-24 19:03:58 浏览: 23
好的,这里提供一个使用 Flask 框架、SQLite 数据库和 Bootstrap 前端框架的简易网站的代码,实现了登录、注册和留言功能。注意,这只是一个简单的示例代码,没有进行安全性和性能方面的优化,请不要直接用于生产环境。
首先需要安装 Flask 和 Flask-WTF 模块,可以使用 pip 命令进行安装:
```
pip install Flask Flask-WTF
```
以下为代码:
```
# app.py
from flask import Flask, render_template, redirect, url_for, flash
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, TextAreaField
from wtforms.validators import DataRequired, Email, EqualTo
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
from datetime import datetime
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret_key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login'
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(120), unique=True, nullable=False)
password = db.Column(db.String(60), nullable=False)
messages = db.relationship('Message', backref='author', lazy=True)
class Message(db.Model):
id = db.Column(db.Integer, primary_key=True)
content = db.Column(db.Text, nullable=False)
date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
class RegistrationForm(FlaskForm):
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
submit = SubmitField('Sign Up')
def validate_email(self, email):
user = User.query.filter_by(email=email.data).first()
if user:
raise ValidationError('Email already exists.')
class LoginForm(FlaskForm):
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
submit = SubmitField('Login')
class MessageForm(FlaskForm):
content = TextAreaField('Message', validators=[DataRequired()])
submit = SubmitField('Post')
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
@app.route('/')
def home():
messages = Message.query.order_by(Message.date_posted.desc()).all()
return render_template('home.html', messages=messages)
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
user = User(email=form.email.data, password=form.password.data)
db.session.add(user)
db.session.commit()
flash('Account created, you can now log in.', 'success')
return redirect(url_for('login'))
return render_template('register.html', form=form)
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(email=form.email.data).first()
if user and user.password == form.password.data:
login_user(user)
flash('Logged in successfully.', 'success')
return redirect(url_for('home'))
else:
flash('Invalid email or password.', 'error')
return render_template('login.html', form=form)
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('home'))
@app.route('/message', methods=['GET', 'POST'])
@login_required
def message():
form = MessageForm()
if form.validate_on_submit():
message = Message(content=form.content.data, author=current_user)
db.session.add(message)
db.session.commit()
flash('Message posted.', 'success')
return redirect(url_for('home'))
return render_template('message.html', form=form)
if __name__ == '__main__':
app.run(debug=True)
```
然后创建以下模板文件:
```
# templates/base.html
<!doctype html>
<html>
<head>
<title>{% block title %}My Website{% endblock %}</title>
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container">
<a class="navbar-brand" href="{{ url_for('home') }}">My Website</a>
{% if current_user.is_authenticated %}
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="nav-link" href="{{ url_for('message') }}">Post Message</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ url_for('logout') }}">Logout</a>
</li>
</ul>
{% else %}
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="nav-link" href="{{ url_for('login') }}">Login</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ url_for('register') }}">Sign Up</a>
</li>
</ul>
{% endif %}
</div>
</nav>
<div class="container mt-5">
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}
<div class="alert alert-{{ message[1] }} alert-dismissible fade show" role="alert">
{{ message[0] }}
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
{% endfor %}
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
</div>
<!-- Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
</body>
</html>
```
```
# templates/home.html
{% extends 'base.html' %}
{% block content %}
{% for message in messages %}
<div class="card mb-3">
<div class="card-body">
<p class="card-text">{{ message.content }}</p>
<p class="card-subtitle text-muted">{{ message.author.email }} - {{ message.date_posted.strftime('%Y-%m-%d %H:%M:%S') }}</p>
</div>
</div>
{% endfor %}
{% endblock %}
```
```
# templates/register.html
{% extends 'base.html' %}
{% block title %}Sign Up{% endblock %}
{% block content %}
<h1>Sign Up</h1>
<form method="POST" action="">
{{ form.hidden_tag() }}
<div class="form-group">
{{ form.email.label }} {{ form.email }}
{% for error in form.email.errors %}
<div class="invalid-feedback">{{ error }}</div>
{% endfor %}
</div>
<div class="form-group">
{{ form.password.label }} {{ form.password }}
{% for error in form.password.errors %}
<div class="invalid-feedback">{{ error }}</div>
{% endfor %}
</div>
<div class="form-group">
{{ form.confirm_password.label }} {{ form.confirm_password }}
{% for error in form.confirm_password.errors %}
<div class="invalid-feedback">{{ error }}</div>
{% endfor %}
</div>
<button type="submit" class="btn btn-primary">Sign Up</button>
</form>
{% endblock %}
```
```
# templates/login.html
{% extends 'base.html' %}
{% block title %}Login{% endblock %}
{% block content %}
<h1>Login</h1>
<form method="POST" action="">
{{ form.hidden_tag() }}
<div class="form-group">
{{ form.email.label }} {{ form.email }}
{% for error in form.email.errors %}
<div class="invalid-feedback">{{ error }}</div>
{% endfor %}
</div>
<div class="form-group">
{{ form.password.label }} {{ form.password }}
{% for error in form.password.errors %}
<div class="invalid-feedback">{{ error }}</div>
{% endfor %}
</div>
<button type="submit" class="btn btn-primary">Login</button>
</form>
{% endblock %}
```
```
# templates/message.html
{% extends 'base.html' %}
{% block title %}Post Message{% endblock %}
{% block content %}
<h1>Post Message</h1>
<form method="POST" action="">
{{ form.hidden_tag() }}
<div class="form-group">
{{ form.content.label }} {{ form.content }}
{% for error in form.content.errors %}
<div class="invalid-feedback">{{ error }}</div>
{% endfor %}
</div>
<button type="submit" class="btn btn-primary">Post</button>
</form>
{% endblock %}
```
以上代码实现了一个简单的登录、注册、留言功能的网站,您可以根据自己的需求进行修改和优化。