基于Python+Flask开发个人博客项目,并实现内网穿透

🚀 作者 :“二当家-小D” 🚀
🚀 博主简介:⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人,8年开发架构经验,精通java,擅长分布式高并发架构,自动化压力测试,微服务容器化k8s等
🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬
🍅文末获取源码联系 配套笔记打包🍅

🚀博客Web项目展示
在这里插入图片描述
在这里插入图片描述

项目主要包含以下功能:个人注册,登录,文章展示,文章详情展示,文章发布模块,文章添加分类模块,文章分类管理模块,用户信息管理模块,程序启动模块。

🚀模块演示

1.个人的注册与登录模块

让用户进行用户的注册,之后判断输入的密码是否一致,并将结果写入到数据库。
在这里插入图片描述

@front.route('/login',methods=['GET','POST'])
def login():
    if request.method=='GET':
        return render_template('login.html')
    elif request.method=='POST':
        username=request.form.get('username')
        password=request.form.get('password')
        user=User.query.filter_by(username=username,password=password).first()
        print(user)
        if user:
            session['user']=username
            print(session['user'])
            flash('登录成功')
            return redirect(url_for('front.index'))
        else:
            flash('登录失败')
            return redirect(url_for('front.login'))

2.首页文章展示模块

合并了分页的功能,当发布文章的数量在当前页面无法展示完全的时候就使用增加分页的方式进行展示,并通过bootstrap提供的分页导航栏进行编写。
在这里插入图片描述

@front.route('/index')
@front.route('/')
# @login_required

def index():
    page=int(request.args.get('page',default=1))   #找到传入的?page=? 参数,没有的话默认就是1,因为传回来的是字符串,所以需要转化成int
    #pre_page=?  这个是设置每一页最多显示几条数据
    paginate=Article.query.order_by(Article.create_time.desc()).paginate(page=page,per_page=5)
    article=paginate.items
    groups=ArticleGroup.query.all()  #拿到模型所有的数据
    return render_template("index.html",groups=groups,article=article,paginate=paginate)

3.文章详情展示模块

这个模块主要是拿到文章模型的全部时间并进行展示,并通过文章的id进行精准展示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H3NWBcYU-1636098859836)(picture/image-20211105153111194.png)]

@front.route('/article_detail/<int:article_id>')
# @login_required
def article_detail(article_id):
    article=Article.query.get(article_id)
    groups=ArticleGroup.query.all()  #拿到模型所有的数据
    return render_template("article_detail.html",groups=groups,article=article)

4.文章发布模块

引入了md格式的文章编写模块,用户可以根据md的语法进行文章发编写与发布,同时增加右边的语法预览框方便用户看到文章的展示情况
在这里插入图片描述

@front.route('/add_article',methods=['GET','POST'])
# @login_required
def add_article():
    if request.method=='GET':
        groups=ArticleGroup.query.all()  #拿到模型所有的数据
        return render_template("add_article.html",groups=groups)
    elif request.method=='POST':
        title=request.form.get('title')
        content=request.form.get('content')
        gid=request.form.get('gid')

        user=User.query.filter_by(username=session.get('user')).first()
        uid=user.id
        # 获取当前时间,从datetime这个库里面
        create_time=datetime.datetime.now()

        article=Article()
        article.title=title
        article.content=content
        article.gid=gid
        article.uid=uid
        article.create_time=create_time
        print(user,title,content,gid,uid,create_time)
        try:
            db.session.add(article)
            db.session.commit()
            flash('添加%s成功' % title)
            return redirect(url_for('front.add_article'))
        except Exception:
            flash('添加%s失败' % title)
            return redirect(url_for('front.add_article'))

5.文章添加分类模块

用户可以输入要增加的分组的名称,之后可以选择分组要展现的颜色进行展示,并把相关数据存入数据库
在这里插入图片描述

@front.route("/add_group",methods=['GET','POST'])
def add_group():
    if request.method=='GET':
        groups = ArticleGroup.query.all()
        colors=['default','primary','success','into','warning','danger']
        return render_template('add_group.html',colors=colors,groups=groups)
    elif request.method=='POST':
        name=request.form.get('name')
        color=request.form.get('color')
        group=ArticleGroup()
        group.name=name
        group.color=color
        try:
            db.session.add(group)
            db.session.commit()
            flash("添加分组成功")
            return redirect(url_for('front.manage'))
        except Exception:
            flash("添加失败")
            return redirect(url_for('front.manage'))

6.文章分类管理模块

对用户编辑的分组与颜色进行编辑与删除的管理功能
在这里插入图片描述

@front.route("/article_group_manage")

def article_group_manage():
    groups = ArticleGroup.query.all()
    return render_template('article_group_mange.html',groups=groups)
@front.route('/edit_group/<int:gid>',methods=['GET','POST'])
def edit_group(gid):
    if request.method=='GET':
        groups=ArticleGroup.query.all()
        #找到通过id找到分组
        group=ArticleGroup.query.get(gid)
        colors = ['default', 'primary', 'success', 'into', 'warning', 'danger']
        return render_template('edit_group.html',group=group,colors=colors,groups=groups)
    elif request.method=='POST':
        name=request.form.get("name")
        color=request.form.get("color")

        group=ArticleGroup.query.get(gid)
        group.name=name
        group.color=color
        try:
            db.session.add(group)
            db.session.commit()
            flash("修改成功")
            return redirect(url_for("front.article_group_manage"))
        except Exception:
            flash("修改失败")
            return redirect(url_for("front.article_group_mange"))


7.文章管理模块

这个模块提供了文章的管理功能,用户如果对已经发布的文章有继续改进的想法可以在这个模块进行编辑,并对文章进行删除或者编辑重新发布的操作。

@front.route('/edit_article/<int:article_id>',methods=['GET','POST'])
def edit_article(article_id):
    if request.method=='GET':
        # 拿到文章内容
        article=Article.query.get(article_id)
        groups=ArticleGroup.query.all()
        return render_template('edit_article.html',groups=groups,article=article)
    elif request.method=='POST':
        title=request.form.get("title")
        content=request.form.get("content")
        gid=request.form.get("gid")
        update_time=datetime.datetime.now()

        article=Article.query.get(article_id)
        article.title=title
        article.content=content
        print(content)
        article.gid=gid
        article.update_time=update_time

        try:
            db.session.commit()
            return redirect(url_for("front.article_manage"))
        except Exception:
            flash("修改%s失败" % title)
            return redirect(url_for("front.article_manage"))
@front.route('/delete_article/<int:article_id>')
def delete_article(article_id):
    article=Article.query.get(article_id)
    try:
        db.session.delete(article)
        db.session.commit()
        flash("删除文章%s成功"%article.title)
        return redirect(url_for("front.article_manage"))
    except Exception:
        flash("删除文章%s失败"%article.title)
        return redirect(url_for("front.article_manage"))

8.用户个人信息注销模块

通过这个模块用户可以一键注销当前登录的账号,并回到登录页面

# 注销登录,在base写上
@front.route('/logout')
def logout():
    session.clear()
    flash("注销登录成功")
    return redirect(url_for('front.login'))

9.信息管理模块

对于上面模块的信息都需要存入到mysql数据库,首先在本地的MySQL数据库创建一个blog库,之后执行Web项目,这个模块会把对于的数据库表信息与数据库表进行映射创建,并赋值对应的类型。实现可以避免手动创建数据表的繁杂操作。

login_manager = LoginManager()

db=SQLAlchemy()    #实例化sqlalchemy对象

class User(db.Model,UserMixin):
    # __tablename__='login_register'
    id = Column(db.Integer,autoincrement=True,primary_key=True)
    #autoincrement自增长
    username=Column(db.String(50),nullable=False)
    password=Column(db.String(128),nullable=True)


    # 没有这个的话,使用{{users}}显示的就是一个对象
    def __repr__(self):
        return self.username

    def get_id(self):
        return True

class Article(db.Model):
    __tablename__='article'
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    title = db.Column(db.String(50), nullable=False,unique=True)
    content=db.Column(db.String(512),nullable=True)
    uid=db.Column(db.Integer,db.ForeignKey('user.id'))
    gid=db.Column(db.Integer,db.ForeignKey('article_group.id'))
    create_time=db.Column(db.DateTime)
    update_time=db.Column(db.DateTime)
    #下面相当于做一个联表查询。
    users=db.relationship('User',backref=db.backref('articles'))
    groups=db.relationship('ArticleGroup',backref=db.backref('articles'))

10.程序启动模块

这个模块为了让Flask的启动入口更加的简洁,我对启动模块的代码进行了封装操作。

def create_app():
    app=Flask(__name__)
    app.config.from_object('config')
    register_blueprint(app)
    db.init_app(app)

    login_manager.init_app(app)
    login_manager.login_view="front.login"
    login_manager.login_message_category='请先登录或注册'

    db.create_all(app=app)
    return app


def register_blueprint(app):
    from front_back import front
    app.register_blueprint(front)

应用程序主类
在这里插入图片描述

from current import create_app

app=create_app()
if __name__ == '__main__':
    app.run(host='0.0.0.0',debug=True,port=83)

到这里我们的博客项目相关模块就编写完成,还有很多的功能小伙伴们可以根据自己的需求添加,由于前端部分的代码太多啦,这里就不展示出来了,需要的小伙伴可以私聊我拿到整体的代码。

12.总结

总体来说要上手Flask这个框架的话还是不难的!需要获取完整源码的同学也可以给我留言哦或者查看个人主页🏭

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 16:50:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 16:50:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 16:50:05       82 阅读
  4. Python语言-面向对象

    2024-04-22 16:50:05       91 阅读

热门阅读

  1. 聚类与分类的区别

    2024-04-22 16:50:05       122 阅读
  2. 【运维基础一】 Linux Centos 常用命令

    2024-04-22 16:50:05       89 阅读
  3. https通信流程

    2024-04-22 16:50:05       189 阅读
  4. 「Python大数据」数据采集-某东产品数据评论获取

    2024-04-22 16:50:05       29 阅读
  5. python 绘图

    2024-04-22 16:50:05       34 阅读
  6. 1、MATLAB介绍

    2024-04-22 16:50:05       31 阅读
  7. vue封装websocket以及心跳检测、重连

    2024-04-22 16:50:05       35 阅读
  8. C# 斜杠与反斜杠以及它们在路径中的使用

    2024-04-22 16:50:05       37 阅读
  9. [c++][netcdf]通过c\c++读取字段的scale_factor与add_offset

    2024-04-22 16:50:05       28 阅读
  10. ES6导出的mapping结构转为ES8的结构

    2024-04-22 16:50:05       31 阅读