引言
Flask 是一个轻量级的 Web 框架,非常适合新手学习和快速开发 Web 应用。本文将为你提供一个实战指南,帮助你从零开始,使用 Flask 搭建一个简单的社交网站。我们将一步步介绍所需的技术栈、环境搭建、代码实现以及部署过程。
技术栈
在开始之前,你需要准备以下技术栈:
- Python 3.x
- Flask
- HTML/CSS/JavaScript
- 数据库(如 SQLite)
- 前端框架(如 Bootstrap)
环境搭建
安装 Python
- 访问 Python 官网 下载并安装 Python 3.x。
- 打开终端,运行
python --version检查 Python 是否安装成功。
安装 Flask
- 打开终端,运行
pip install flask安装 Flask。
安装其他依赖
- 打开终端,运行以下命令安装其他依赖:
pip install flask_sqlalchemy
pip install flask_migrate
pip install flask_wtf
pip install flask_login
pip install flask_mail
pip install flask_bootstrap
项目结构
创建一个名为 social_network 的文件夹,并在其中创建以下文件和目录:
social_network/
│
├── app/
│ ├── __init__.py
│ ├── models.py
│ ├── forms.py
│ ├── views.py
│ └── templates/
│ ├── base.html
│ ├── index.html
│ ├── login.html
│ ├── register.html
│ └── profile.html
│
├── config.py
└── run.py
代码实现
初始化 Flask 应用
在 social_network/app/__init__.py 文件中,编写以下代码:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from flask_mail import Mail
app = Flask(__name__)
app.config.from_object('config.Config')
db = SQLAlchemy(app)
login_manager = LoginManager(app)
mail = Mail(app)
from social_network.app import views, models
配置数据库
在 social_network/config.py 文件中,配置数据库连接信息:
class Config:
SQLALCHEMY_DATABASE_URI = 'sqlite:///social_network.db'
SECRET_KEY = 'your_secret_key'
MAIL_SERVER = 'smtp.example.com'
MAIL_PORT = 587
MAIL_USE_TLS = True
MAIL_USERNAME = 'your_email@example.com'
MAIL_PASSWORD = 'your_email_password'
创建模型
在 social_network/app/models.py 文件中,定义用户和帖子模型:
from flask_login import UserMixin
from . import db
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(128))
posts = db.relationship('Post', backref='author', lazy='dynamic')
def __repr__(self):
return '<User {}>'.format(self.username)
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.String(140))
timestamp = db.Column(db.DateTime)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
def __repr__(self):
return '<Post {}>'.format(self.body)
创建表单
在 social_network/app/forms.py 文件中,定义注册和登录表单:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField
from wtforms.validators import DataRequired, Email, EqualTo
class LoginForm(FlaskForm):
username = StringField('Username', validators=[DataRequired()])
password = PasswordField('Password', validators=[DataRequired()])
remember_me = BooleanField('Remember Me')
submit = SubmitField('Sign In')
class RegistrationForm(FlaskForm):
username = StringField('Username', validators=[DataRequired()])
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
password2 = PasswordField(
'Repeat Password', validators=[DataRequired(), EqualTo('password')])
submit = SubmitField('Register')
创建视图
在 social_network/app/views.py 文件中,编写视图函数:
from flask import render_template, flash, redirect, url_for, request
from flask_login import current_user, login_user, logout_user, login_required
from . import app, db
from .forms import LoginForm, RegistrationForm
from .models import User, Post
@app.route('/')
@app.route('/index')
@login_required
def index():
posts = current_user.posts.all()
return render_template('index.html', posts=posts)
@app.route('/login', methods=['GET', 'POST'])
def login():
if current_user.is_authenticated:
return redirect(url_for('index'))
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.username.data).first()
if user is None or not user.check_password(form.password.data):
flash('Invalid username or password')
return redirect(url_for('login'))
login_user(user, remember=form.remember_me.data)
return redirect(url_for('index'))
return render_template('login.html', title='Sign In', form=form)
@app.route('/register', methods=['GET', 'POST'])
def register():
if current_user.is_authenticated:
return redirect(url_for('index'))
form = RegistrationForm()
if form.validate_on_submit():
user = User(username=form.username.data, email=form.email.data)
user.set_password(form.password.data)
db.session.add(user)
db.session.commit()
flash('Congratulations, you are now a registered user!')
return redirect(url_for('login'))
return render_template('register.html', title='Register', form=form)
@app.route('/logout')
def logout():
logout_user()
return redirect(url_for('index'))
@app.route('/post/new', methods=['GET', 'POST'])
@login_required
def new_post():
form = PostForm()
if form.validate_on_submit():
post = Post(body=form.body.data, author=current_user)
db.session.add(post)
db.session.commit()
flash('Your post is now live!')
return redirect(url_for('index'))
return render_template('new_post.html', title='New Post', form=form)
@app.route('/user/<username>')
@login_required
def user(username):
user = User.query.filter_by(username=username).first_or_404()
posts = user.posts.all()
return render_template('user.html', user=user, posts=posts)
创建模板
在 social_network/app/templates 目录下,创建以下 HTML 模板:
base.html:基础模板,包含导航栏和页脚。index.html:首页模板,显示用户发布的帖子。login.html:登录表单模板。register.html:注册表单模板。profile.html:用户个人资料模板。
部署
生成数据库迁移脚本
- 打开终端,运行以下命令生成数据库迁移脚本:
flask db init
flask db migrate -m "Initial migration."
flask db upgrade
部署到生产环境
- 修改
social_network/config.py文件,配置生产环境数据库连接信息。 - 使用 Gunicorn 或 uWSGI 将 Flask 应用部署到生产环境。
总结
通过本文,你学会了如何使用 Flask 搭建一个简单的社交网站。你可以根据实际需求,添加更多功能,如私信、好友关系等。祝你学习愉快!
