创建一个简单的个人博客系统涉及多个步骤,包括设计数据库模型、创建后端API、构建前端页面以及处理用户认证等。以下是一个简单的个人博客系统的设计和实现概述,以及相关的Python代码示例。
1. 设计数据库模型
首先,我们需要设计数据库模型来存储博客文章、用户信息和其他相关数据。这里我们使用SQLAlchemy作为ORM来操作数据库。
python复制代码
from sqlalchemy import Column, Integer, String, Text, ForeignKey | |
from sqlalchemy.ext.declarative import declarative_base | |
from sqlalchemy.orm import relationship | |
from sqlalchemy import create_engine | |
Base = declarative_base() | |
class User(Base): | |
__tablename__ = 'users' | |
id = Column(Integer, primary_key=True) | |
username = Column(String(50), nullable=False, unique=True) | |
email = Column(String(50), nullable=False, unique=True) | |
password = Column(String(50), nullable=False) | |
articles = relationship("Article", back_populates="author") | |
def __repr__(self): | |
return f"<User(username='{self.username}', email='{self.email}')>" | |
class Article(Base): | |
__tablename__ = 'articles' | |
id = Column(Integer, primary_key=True) | |
title = Column(String(100), nullable=False) | |
content = Column(Text, nullable=False) | |
author_id = Column(Integer, ForeignKey('users.id')) | |
author = relationship("User", back_populates="articles") | |
def __repr__(self): | |
return f"<Article(title='{self.title}')>" |
2. 创建后端API
接下来,我们使用Flask框架创建后端API来处理用户请求。
python复制代码
from flask import Flask, request, jsonify, render_template | |
from flask_sqlalchemy import SQLAlchemy | |
from flask_bcrypt import Bcrypt | |
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user | |
app = Flask(__name__) | |
app.config['SECRET_KEY'] = 'your_secret_key' | |
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db' | |
db = SQLAlchemy(app) | |
bcrypt = Bcrypt(app) | |
login_manager = LoginManager(app) | |
login_manager.login_view = 'login' | |
class User(UserMixin, db.Model): | |
# ... (与上面的User类相同) | |
def set_password(self, password): | |
self.password = bcrypt.generate_password_hash(password).decode('utf-8') | |
def check_password(self, password): | |
return bcrypt.check_password_hash(self.password, password) | |
@login_manager.user_loader | |
def load_user(user_id): | |
return User.query.get(int(user_id)) | |
@app.route('/register', methods=['POST']) | |
def register(): | |
data = request.get_json() | |
username = data.get('username') | |
email = data.get('email') | |
password = data.get('password') | |
if User.query.filter_by(username=username).first(): | |
return jsonify({'error': 'Username already exists'}), 400 | |
if User.query.filter_by(email=email).first(): | |
return jsonify({'error': 'Email already exists'}), 400 | |
user = User(username=username, email=email) | |
user.set_password(password) | |
db.session.add(user) | |
db.session.commit() | |
return jsonify({'message': 'User registered successfully'}), 201 | |
@app.route('/login', methods=['POST']) | |
def login(): | |
data = request.get_json() | |
username = data.get('username') | |
password = data.get('password') | |
user = User.query.filter_by(username=username).first() | |
if not user or not user.check_password(password): | |
return jsonify({'error': 'Invalid username or password'}), 401 | |
login_user(user) | |
return jsonify({'message': 'Logged in successfully'}), 200 | |
@app.route('/logout') | |
@login_required | |
def logout(): | |
logout_user() | |
return jsonify({'message': 'Logged |