知了问答 flask实战项目笔记(一)

知了问答 flask实战项目笔记(一)

1. 项目结构搭建

首先新建一个flask的项目,python环境选择先前使用过的环境,也可以选择新建环境
在这里插入图片描述
之后再新建一个config.py的文件,用来存放配置相关的
在这里插入图片描述
通过在app.py中进行绑定app.config.from_object(config)
在这里插入图片描述

第二件事情就是创建一个存放扩展文件/插件的地方,名为exts.py,
比如之前使用的flask-sqlalchemy

这样能够解决循环引用
在这里插入图片描述
在这里插入图片描述

创建models.py文件,用于存放模版对象
在这里插入图片描述
在app.py中配置db,将app对象传给db

在这里插入图片描述
蓝图buleprint

blueprint是用来进行视图函数模块化管理的,就是网络请求放在其他文件中,而不直接放在app.py文件中
blueprint需要在app.py文件中注册
在这里插入图片描述
auth.py

"""
@author: wtf
@file: auth.py
@time: 2024/5/8 16:36
@desc: Authorization related view controllers
"""
from flask import Blueprint

bp = Blueprint("auth", __name__, url_prefix="/auth")  # url_prefix代表访问前缀

# 相当于127.0.0.1:5000/auth/login
@bp.route("/login")
def user_login():
    pass

qa.py

"""
@author: wtf
@file: qa.py
@time: 2024/5/8 16:39
@desc: View controllers related to Q&A
"""
from flask import Blueprint
bp = Blueprint("qa", __name__, url_prefix="/")

bp.route("/")
def index():
    pass

app.py中绑定蓝图

# 注册blueprint
app.register_blueprint(qa_bp)
app.register_blueprint(auth_bp)

2.User模型创建

创建User模型

class UserModel(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(100), nullable=False)
    email = db.Column(db.String(100), nullable=False, unique=True)
    join_time = db.Column(db.DateTime, default=datetime.now)  # 默认值为当前存储时间,传入的是一个函数,所以不用加()

配置config.py文件

"""
@author: wtf
@file: config.py
@time: 2024/5/8 16:09
"""

# 配置数据库信息
HOSTNAME = "127.0.0.1"
PORT = 3306
USERNAME = "root"
PASSWORD = 1234
DATABASE = "zhiliaooa"
DB_URI = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8'
SQLALCHEMY_DATABASE_URI = DB_URI  # 这句不能少,少了migrate时会报错

app.py文件内容为:

"""
@author: wtf
@file: config.py
@time: 2024/5/8 16:06
"""

from flask import Flask
import config
from exts import db
from models import UserModel
from blueprints.qa import bp as qa_bp
from blueprints.auth import bp as auth_bp
from flask_migrate import Migrate
app = Flask(__name__)

# 绑定配置文件
app.config.from_object(config)
migrate = Migrate(app, db)
# 配置db
db.init_app(app)
# 注册blueprint
app.register_blueprint(qa_bp)
app.register_blueprint(auth_bp)
if __name__ == '__main__':
    app.run()

然后使用命令行写入数据库

flask db init
flask db imgrate
flask db upgrade

最后生成数据库
在这里插入图片描述

3.html页面改造

通过继承父类模版,能够使得子类模版的内容较少,且美观
提取到base.html
记得将资源路径给成jinjia2模式下的写法<link rel="stylesheet" href="{{ url_for('static', filename="css/init.css") }}">

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="{{ url_for('static', filename="bootstrap/bootstrap.4.6.min.css") }}">
    <link rel="stylesheet" href="{{ url_for('static', filename="css/init.css") }}">
    {% block head %}{% endblock %}
    <title>{% block title %}{% endblock %}</title>
</head>

<body>
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
        <div class="container">
            <a class="navbar-brand" href="#">知了问答</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarSupportedContent">
                <ul class="navbar-nav mr-auto">
                    <li class="nav-item active">
                        <a class="nav-link" href="/">首页 <span class="sr-only">(current)</span></a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" href="#">发布问答</a>
                    </li>
                    <li class="nav-item ml-2">
                        <form class="form-inline my-2 my-lg-0" method="GET" action="#">
                            <input class="form-control mr-sm-2" type="search" placeholder="关键字" aria-label="Search" name="q">
                            <button class="btn btn-outline-success my-2 my-sm-0" type="submit">搜索</button>
                        </form>
                    </li>
                </ul>
                <ul class="navbar-nav">
                    <li class="nav-item">
                        <a class="nav-link" href="#">登录</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" href="#">注册</a>
                    </li>
                </ul>
            </div>
        </div>
    </nav>
    <div class="container">
        {% block body %}{% endblock %}
    </div>
</body>

</html>

register.html

{% extends "base.html" %}
{% block title %}
    知了传课-注册
{% endblock %}
{% block body %}
    <div class="container">
        <div class="row mt-4">
            <div class="col"></div>
            <div class="col">
                <form method="POST" action="#">
                    <div class="form-group">
                        <label for="exampleInputEmail1">邮箱</label>
                        <input type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" name="email">
                        <small id="emailHelp" class="form-text text-muted">我们不会把邮箱用于其他用户</small>
                    </div>
                    <div class="form-group">
                        <label for="exampleInputEmail1">验证码</label>
                        <div class="input-group">
                            <input type="text" class="form-control" name="captcha">
                            <div class="input-group-append">
                                <button class="btn btn-outline-secondary" type="button" id="captcha-btn">获取验证码</button>
                            </div>
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="exampleInputEmail1">用户名</label>
                        <input type="text" class="form-control" name="username">
                    </div>
                    <div class="form-group">
                        <label for="exampleInputPassword1">密码</label>
                        <input type="password" class="form-control" id="exampleInputPassword1" name="password">
                    </div>
                    <div class="form-group">
                        <label for="exampleInputPassword1">确认密码</label>
                        <input type="password" class="form-control" name="password_confirm">
                    </div>
                    <button type="submit" class="btn btn-primary btn-block">立即注册</button>
                </form>
            </div>
            <div class="col"></div>
        </div>
    </div>
{% endblock %}



  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Flask论坛实战了传课是一门实践性很强的课程,旨在帮助学生学习和掌握使用Flask框架开发一个完整、功能完备的论坛应用。 Flask是一个轻量级的Python Web框架,开发人员可以快速构建Web应用程序。了传课采用实战教学的方式,通过一系列的案例和项目,引导学生逐步了解和掌握Flask框架的使用。 在这门课程中,学生将学习到如何创建一个Flask应用,包括如何设置路由、处理数据请求和响应、使用模板引擎渲染页面等。同时,学生还将学习到如何处理用户认证和授权、实现用户发表文章和评论、上传图片等功能。 这门课程不仅仅注重理论识的传授,更注重实践操作和项目的实现。学生将通过跟随案例和项目的指导,动手实现一个完整的论坛应用。通过实际操作,他们将了解到如何从零开始搭建一个Flask应用,以及如何解决在开发过程中遇到的各种问题。 此外,这门课程还会介绍一些Flask扩展和工具,如数据库ORM框架SQLAlchemy、表单扩展WTForms、测试框架unittest等。学生将学习到如何使用这些工具来提高开发效率和代码质量。 总之,通过Flask论坛实战了传课,学生将能够掌握Flask框架的使用,了解Web应用开发的基本识,同时也会提升自己的编码能力和项目实践经验。无论是对于想要从事Web开发的初学者,还是对于已有一定开发经验的人来说,这门课程都是相当有价值的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值