【python】Flask网页开发——论坛项目实战(完整代码)

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~

【论坛项目实战】
【python】Flask网页开发——论坛项目实战(完整代码)
【python】Flask网页开发——论坛项目实战(1.导航条实现)
【python】Flask网页开发——论坛项目实战(2.登录与注册)
【python】Flask网页开发——论坛项目实战(3.问答模块)

项目展示

页面展示

首页
在这里插入图片描述
发布问答
在这里插入图片描述
登录
在这里插入图片描述
注册
在这里插入图片描述
问答详情
在这里插入图片描述

具体实现

1.导航条实现

2.登录与注册

3.问答模块

项目结构

1.创建项目

在这里插入图片描述

2.项目需要提前安装的包

  • pymysql:Python操作数据库的驱动程序
  • Flask-SQLAlchemy:在Flask中使用ORM模型操作数据库
  • cryptography:对密码进行加密和解密
  • Flask-Migrate:将ORM模型的变更同步到数据库中
  • WTForms:用于处理表单的Python库
  • Flask-Mail : Flask 框架的一个扩展,用于在 Web 应用程序中发送电子邮件。

3.项目结构

在这里插入图片描述

blueprints

forms.py

import wtforms
from wtforms.validators import length, email, EqualTo
from models.models import EmailCaptchaModel, UserModel


class LoginForm(wtforms.Form):
    email = wtforms.StringField(validators=[email()])
    password = wtforms.StringField(validators=[length(min=6, max=20)])


class RegisterForm(wtforms.Form):
    username = wtforms.StringField(validators=[length(min=3, max=20)])
    email = wtforms.StringField(validators=[email()])
    captcha = wtforms.StringField(validators=[length(min=4, max=4)])
    password = wtforms.StringField(validators=[length(min=6, max=20)])
    confirm_password = wtforms.StringField(validators=[EqualTo("password")])

    def validate_captcha(self, field):
        captcha = field.data
        email = self.email.data
        captcha_model = EmailCaptchaModel.query.filter_by(email=email).first()
        if not captcha_model or captcha_model.captcha.lower() != captcha.lower():
            raise wtforms.ValidationError("邮箱验证码错误!")

    def validate_email(self, field):
        email = field.data
        user_model = UserModel.query.filter_by(email=email).first()
        if user_model:
            raise wtforms.ValidationError("邮箱已存在!")


class QuestionForm(wtforms.Form):
    title = wtforms.StringField(validators=[length(min=3, max=200)])
    content = wtforms.StringField(validators=[length(min=5)])


class AnswerForm(wtforms.Form):
    content = wtforms.StringField(validators=[length(min=1)])

qa.py

from flask import Blueprint, render_template, request, g, redirect, url_for, flash
from decorators import login_required
from exts import db
from .forms import QuestionForm,AnswerForm
from models.models import QuestionModel, AnswerModel
from sqlalchemy import or_

bp = Blueprint("qa", __name__, url_prefix="/")


@bp.route("/")
def index():
    questions = QuestionModel.query.order_by(db.text("-create_time")).all()
    return render_template("index.html", questions=questions)


@bp.route("/question/public", methods=['GET', 'POST'])
@login_required  # 装饰器
def public_question():
    # 判断是否登录,没有登录,跳转到登录页面
    if request.method == 'GET':
        return render_template("public_question.html")
    else:
        form = QuestionForm(request.form)
        if form.validate():
            title = form.title.data
            content = form.content.data
            question = QuestionModel(title=title, content=content, author=g.user)
            db.session.add(question)
            db.session.commit()
            return redirect("/")
        else:
            flash("标题或内容格式错误!")
            return redirect(url_for("qa.public_question"))


@bp.route("/question/<int:question_id>")
def question_detail(question_id):
    question = QuestionModel.query.get(question_id)
    return render_template("detail.html", question=question)


@bp.route("/answer/<int:question_id>", methods=['POST'])
@login_required  # 装饰器
def answer(question_id):  # 注册
    form = AnswerForm(request.form)  # 存储前端表单的内容
    if form.validate():
        content = form.content.data
        answer_model = AnswerModel(content=content, author=g.user, question_id=question_id)
        db.session.add(answer_model)
        db.session.commit()
        return redirect(url_for("qa.question_detail", question_id=question_id))
    else:
        flash("请填写评论再提交!")
        return redirect(url_for("qa.question_detail", question_id=question_id))


@bp.route("/search")
def search():
    kword = request.args.get("kword")
    questions = QuestionModel.query.filter(or_(QuestionModel.title.contains(kword),QuestionModel.content.contains(kword))).order_by(db.text("-create_time"))

    return render_template("index.html",questions = questions)

user.py

from datetime import datetime
from flask import Blueprint, render_template, request, redirect, url_for, jsonify, session, flash
from exts import mail
from flask_mail import Message
from models.models import EmailCaptchaModel, UserModel
import string
import random
from exts import db
from .forms import RegisterForm, LoginForm
from werkzeug.security import generate_password_hash, check_password_hash

bp = Blueprint("user", __name__, url_prefix="/user")


@bp.route("/login", methods=['GET', 'POST'])
def login():    # 登录
    if request.method == 'GET':
        return render_template("login.html")
    else:
        form = LoginForm(request.form)  # 存储前端表单的内容
        if form.validate():
            email = form.email.data
            password = form.password.data
            user = UserModel.query.filter_by(email=email).first()
            if user and check_password_hash(user.password, password):
                session['user_id'] = user.id
                return redirect("/")
            else:
                flash("邮箱和密码不匹配!")
                return redirect(url_for("user.login"))
        else:
            flash("格式错误!")
            return redirect(url_for("user.login"))


@bp.route("/register", methods=['GET', 'POST'])
def register():    # 注册
    if request.method == 'GET':
        return render_template("register.html")
    else:
        form = RegisterForm(request.form)  # 存储前端表单的内容
        if form.validate():
            email = form.email.data
            username = form.username.data
            password = form.password.data

            hash_password = generate_password_hash(password)
            user = UserModel(email=email
  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Python Flask是一种轻量级的Web框架,它可以帮助开发者快速构建Web应用程序。本书《Python Flask Web开发入门与项目实战》介绍了Flask的基础知识和实践技巧,包括路由、模板、表单、数据库、认证、部署等方面。此外,本书还提供了多个实战项目,如博客、电子商务、社交网络等,帮助读者深入理解Flask的应用场景和开发流程。对于想要学习Python Flask开发者来说,这是一本非常实用的入门指南。 ### 回答2: Python Flask是一种基于Python语言的轻量级Web框架,它具有易学易用、灵活、可扩展性强、速度快等特点,因此在Web开发领域有着广泛的应用。Python Flask提供了许多简单易用的工具和方法,使得开发者能够轻松地构建Web应用程序。本文旨在介绍Python Flask的基础知识和实践项目,帮助初学者快速上手并实现简单的Web应用程序。 Python Flask Web开发入门: 1. Flask的安装与使用:首先需要安装Python Flask库,可以使用pip安装,安装完成后即可使用Flask构建Web应用。 2. Flask路由和视图函数:Flask路由是URL到视图函数的映射,基于路由可以添加多个视图函数,以实现不同的功能。Flask的视图函数是一个Python函数,它处理来自Web客户端的请求,并返回响应结果。 3. Flask模板和静态文件:Flask支持使用模板引擎来构建Web页面,通常使用Jinja2模板引擎。另外,Flask还支持使用静态文件,如CSS、JavaScript和图片等,以优化Web页面的展示效果。 4. Flask表单:Flask支持使用表单来接收来自Web客户端的数据,包括GET和POST请求。开发者可以使用Flask-WTF库来实现表单验证和数据的处理。 Python Flask Web开发项目实战: 1. 论坛网站:使用Flask实现一个简单的论坛网站,包括用户注册、登录、发帖和评论等功能。前端可以使用Bootstrap框架。 2. 个人博客:使用Flask和SQLAlchemy实现一个个人博客网站,包括文章展示、评论、分类和标签等功能。 3. 电子商务网站:使用FlaskFlask-RESTful实现一个电子商务网站,包括商品展示、购物车、订单和支付等功能。前端可以使用React框架。 总之,Python Flask是一个功能强大而易用的Web框架,对于Web开发初学者来说,学习和掌握它是非常重要的。在实践项目中,不断地提升自己的实战经验,才能更好地掌握Python Flask的使用和应用。 ### 回答3: Python Flask是一种轻量级的Web应用程序框架,其用途是帮助Web开发人员更轻松地构建Web应用程序。如果您想学习Python Flask Web开发,以下是一些重要方面: 首先,需要了解Python Flask的基本概念和架构,以及如何安装、配置和运行Flask应用程序。可以在官方网站或在线学习网站上学习这些内容。 其次,需要学习Python Flask的路由(routing)功能,了解如何为不同的URL路径配置不同的代码处理程序,以及如何从请求对象(request object)中获取并处理相关数据。 进一步,需要了解Python Flask的框架能够支持各种Web表单,需要掌握如何使用Flask的表单功能和模板引擎,以及如何渲染HTML页面以及处理表单数据。 另外,还需要熟悉处理静态文件的方法和技术,例如CSS、JavaScript和图像等。 最后,要通过实际项目来练习和巩固所学知识。可以使用Python Flask构建博客、社交媒体平台或电子商务网站等应用程序。 需要注意的是,要成为一名成功的Python Flask Web开发人员,需要在学习过程中不断提升自己的编码技能以及学习新技术。同时,也需要具备良好的沟通能力和团队协作能力,以配合其他开发者共同完成项目的构建。 总之,学习Python Flask Web开发需要投入充足的时间和精力,逐步掌握语言、框架和技术,并通过实践来提高自己的技能和能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zz的学习笔记本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值