使用Python+Flask开发博客项目,并实现内网穿透_flask框架内网攻击(1)

本文详细描述了一个基于Flask的Web应用,包括用户注册与登录验证、文章的展示、详细查看、发布以及分类管理,使用了MD5加密存储密码,Bootstrap进行前端设计,强调了系统化学习的重要性。
摘要由CSDN通过智能技术生成

🚀下面我们对各个模块的代码进行编写

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

这个模块的主要让用户进行用户的注册,之后判断输入的密码是否一致,并将结果写入到数据库。

在这里插入图片描述

from flask import render_template, redirect, url_for, request, flash, session
from front_back import front
from modles.dbmodels import User, db
import hashlib
from utils import login_check


@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'))

@front.route('/register',methods=['GET','POST'])
def register():
        # 如果是get请求的话就返回页面,post请求的话就接收表单数据
        if request.method == 'GET':
            return render_template("register.html")
        elif request.method == 'POST':
            username = request.form.get('username')
            password = request.form.get('password')
            check_password = request.form.get('check\_password')

            if username and password and password == check_password:
                md5 = hashlib.md5()
                md5.update(password.encode('utf-8'))
                user = User()

                user.username = username
                # 使用hashlib加密密码再存入数据库,拿到md5.hexdigest()加密后的密码
                user.password = md5.hexdigest()
                user.password=password
                print(username,password)
            try:
               db.session.add(user)
               db.session.commit()
               flash('注册成功,欢迎访问我的个人博客!')
               return redirect(url_for('front.register'))
            except Exception:
               flash('注册失败,请检查密码后重新注册')
               return redirect(url_for('front.register'))
        else:
             flash('注册失败')
             return redirect(url_for('front.register'))

2.首页文章展示模块

这个模块合并了分页的功能,当发布文章的数量在当前页面无法展示完全的时候就使用增加分页的方式进行展示,并通过bootstrap提供的分页导航栏进行编写。使用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"))

# 删除的 视图函数
@front.route('/delete\_group/<int:gid>')
def delete\_group(gid):
    group=ArticleGroup.query.get(gid)
    try:
        db.session.delete(group)
        db.session.commit()
        flash('删除%s成功' % group.name)
        return redirect(url_for("front.article\_group\_manage"))
    except Exception:
        flash('删除%s失败' % group.name)
        return redirect(url_for("front.article\_group\_manage"))


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)


![img](https://img-blog.csdnimg.cn/img_convert/2263f3a2058225146f9057f840c85dfd.png)
![img](https://img-blog.csdnimg.cn/img_convert/929f2fc5dbd163cc11b3eb8e562f8fd1.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

存中...(img-5WoSirQ9-1714285127262)]
[外链图片转存中...(img-0kgbEoW3-1714285127262)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值