当前位置:  首页>> 技术小册>> Flask框架入门指南

实战项目十三:构建社交网络(一):用户关系

在本章节中,我们将深入探索如何使用Flask框架构建一个社交网络应用的核心部分之一——用户关系系统。用户关系是社交网络的基石,它定义了用户之间的连接、互动和社区结构。通过实现用户关系系统,我们能够让用户能够添加好友、查看好友列表、以及基于这些关系进行各种社交活动,如分享内容、评论、点赞等。

1. 项目概述

在构建社交网络之前,我们需要明确项目的基本需求和目标。本章节将聚焦于用户关系的建立与管理,包括用户注册、登录、添加好友、删除好友、以及查看好友列表等功能。我们将使用Flask作为后端框架,结合数据库(如SQLite或MySQL)来存储用户数据和关系数据。

2. 数据库设计

2.1 用户表(Users)

首先,我们需要一个用户表来存储用户的基本信息,如用户名、密码(加密存储)、邮箱等。考虑到用户关系的需要,我们还需要为每个用户添加一个唯一标识符(如ID),用于关联其他表中的数据。

  1. CREATE TABLE Users (
  2. id INTEGER PRIMARY KEY AUTOINCREMENT,
  3. username TEXT UNIQUE NOT NULL,
  4. password TEXT NOT NULL,
  5. email TEXT UNIQUE NOT NULL
  6. );
2.2 用户关系表(UserRelationships)

为了表示用户之间的好友关系,我们需要一个用户关系表。这个表至少应包含两个字段:发起者ID(from_user_id)和接收者ID(to_user_id),以及一个可选的状态字段(status)来表示关系的状态(如已请求、已接受、已拒绝、已删除等)。

  1. CREATE TABLE UserRelationships (
  2. id INTEGER PRIMARY KEY AUTOINCREMENT,
  3. from_user_id INTEGER NOT NULL,
  4. to_user_id INTEGER NOT NULL,
  5. status TEXT NOT NULL DEFAULT 'pending',
  6. FOREIGN KEY(from_user_id) REFERENCES Users(id),
  7. FOREIGN KEY(to_user_id) REFERENCES Users(id),
  8. UNIQUE(from_user_id, to_user_id)
  9. );

注意:这里使用了UNIQUE约束来确保每对用户之间只存在一种状态的关系记录。

3. Flask应用结构

为了组织代码,我们将按照Flask项目的典型结构来构建应用:

  • app.py:Flask应用的主入口。
  • templates/:存放HTML模板文件。
  • static/:存放静态文件,如CSS、JavaScript和图片。
  • models.py:定义数据库模型。
  • routes.py:定义路由和视图函数。
  • forms.py:定义Web表单。

4. 实现用户注册与登录

在开始实现用户关系之前,我们需要确保用户能够注册和登录。这通常涉及创建用户表单、处理表单数据、验证用户输入、以及将用户信息保存到数据库中。

4.1 用户注册

forms.py中定义一个用户注册表单:

  1. from flask_wtf import FlaskForm
  2. from wtforms import StringField, PasswordField, SubmitField
  3. from wtforms.validators import DataRequired, Email, EqualTo, ValidationError
  4. from models import db, User
  5. class RegistrationForm(FlaskForm):
  6. username = StringField('Username', validators=[DataRequired()])
  7. email = StringField('Email', validators=[DataRequired(), Email()])
  8. password = PasswordField('Password', validators=[DataRequired()])
  9. confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
  10. submit = SubmitField('Register')
  11. def validate_username(self, username):
  12. user = User.query.filter_by(username=username.data).first()
  13. if user is not None:
  14. raise ValidationError('Please use a different username.')
  15. def validate_email(self, email):
  16. user = User.query.filter_by(email=email.data).first()
  17. if user is not None:
  18. raise ValidationError('Please use a different email address.')

routes.py中处理注册请求:

  1. from flask import render_template, redirect, url_for, flash
  2. from .forms import RegistrationForm
  3. from .models import db, User
  4. @app.route('/register', methods=['GET', 'POST'])
  5. def register():
  6. form = RegistrationForm()
  7. if form.validate_on_submit():
  8. hashed_password = generate_password_hash(form.password.data) # 假设已导入generate_password_hash
  9. new_user = User(username=form.username.data, email=form.email.data, password=hashed_password)
  10. db.session.add(new_user)
  11. db.session.commit()
  12. flash('Congratulations, you are now a registered user!')
  13. return redirect(url_for('login'))
  14. return render_template('register.html', title='Register', form=form)
4.2 用户登录

类似地,定义登录表单和视图函数。

5. 实现用户关系

5.1 添加好友

首先,我们需要在前端提供一个界面让用户能够输入想要添加为好友的用户名或邮箱。然后,在后端,我们需要根据输入的信息查询数据库,判断该用户是否存在,并创建相应的用户关系记录。

  1. @app.route('/add_friend/<int:user_id>', methods=['POST'])
  2. @login_required # 假设已定义login_required装饰器
  3. def add_friend(user_id):
  4. current_user = current_user() # 假设已定义current_user函数
  5. if user_id == current_user.id:
  6. flash('You cannot add yourself as a friend!')
  7. return redirect(url_for('profile', user_id=current_user.id))
  8. friend = User.query.get_or_404(user_id)
  9. # 检查是否已经存在关系
  10. relationship = UserRelationship.query.filter_by(from_user_id=current_user.id, to_user_id=friend.id).first()
  11. if relationship and relationship.status == 'accepted':
  12. flash('You are already friends with this user.')
  13. return redirect(url_for('profile', user_id=friend.id))
  14. # 创建新的关系记录
  15. new_relationship = UserRelationship(from_user_id=current_user.id, to_user_id=friend.id, status='pending')
  16. db.session.add(new_relationship)
  17. db.session.commit()
  18. flash('Friend request sent!')
  19. return redirect(url_for('profile', user_id=friend.id))
5.2 查看好友列表

用户需要能够查看自己的好友列表。这通常意味着从数据库中检索当前用户所有已接受好友关系的记录,并显示相应的用户信息。

  1. @app.route('/friends', methods=['GET'])
  2. @login_required
  3. def friends():
  4. current_user = current_user()
  5. friends = UserRelationship.query.filter_by(from_user_id=current_user.id, status='accepted').join(User, UserRelationship.to_user_id == User.id).all()
  6. return render_template('friends.html', title='Friends', friends=friends)

friends.html模板中,你可以遍历friends列表,并显示每个好友的用户名或其他信息。

6. 总结与扩展

本章节介绍了如何在Flask应用中构建社交网络的核心部分之一——用户关系系统。我们设计了数据库模型,实现了用户注册、登录、添加好友以及查看好友列表等功能。然而,一个完整的社交网络应用还需要更多功能,如消息系统、内容分享、隐私设置等。在后续章节中,我们将继续探索这些高级特性,以构建一个功能全面的社交网络应用。

此外,随着用户数量的增加,我们还需要考虑应用的可扩展性和性能优化问题。例如,使用缓存来减少数据库查询次数、优化数据库查询语句、以及考虑使用更高效的数据库管理系统等。这些都是在开发大型社交网络应用时需要重点关注的问题。


该分类下的相关小册推荐: