使用Python+Flask开发博客项目,并实现内网穿透

简介: 使用Python+Flask开发博客项目,并实现内网穿透

前言


Flask是一个使用python编写的轻量级Web框架,对比其他相同类型的框架而言,这个框架更加的灵活轻便。并且具有很强的定制性,用户可以根据自己的需求添加功能,有强大的插件库,这也是为什么这个框架在python领域一直火热的原因。这篇文章我们将使用这个框架编写一个属于自己的博客网站!并教你如何通过使用内网穿透工具处理项目,让本地的项目可以在公网访问!


文章目录

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

2.首页文章展示模块

3.文章详情展示模块

4.文章发布模块

5.文章添加分类模块

6.文章分类管理模块

7.文章管理模块

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

9.信息管理模块

10.程序启动模块

11.内网穿透模块

12.总结

🚀首先来看看我们开发的博客Web项目的一些展示



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


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


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

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


image.png

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进行前端页面的开发,可以让我们在不具备很好的前端知识的情况下也可以开发出精美的页面。


image.png

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

image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png

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

image.pngimage.pngimage.pngimage.pngimage.pngimage.png

image.png

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'))
    def __repr__(self):
        return '<Article %s>'%self.title
class ArticleGroup(db.Model):
    __tablename__='article_group'
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    name = db.Column(db.String(50), nullable=False,unique=True)
    color= db.Column(db.String(50), nullable=False)
    def __repr__(self):
        return '<ArticleGroup %s>'% self.name
@login_manager.user_loader
def get_user(user_id):
    #对主键的查询是没有必要使用filler_by的
    user = db.session.query(User).get(user_id)
    return user

image.pngimage.pngimage.png到这里我们的博客项目相关模块就编写完成啦,其实还有很多的功能小伙伴们可以根据自己的需求添加,这也是Flask极具特色的一个地方,这里要说明的一点是,由于前端部分的代码太多啦,这里就不展示出来了,需要的小伙伴可以私聊我拿到整体的代码哟。


11.内网穿透模块

这个模块对于很多小伙伴来说可能比较陌生,这里举一个例子方便小伙伴们理解。


假如说我们要把上面写好的项目进行部署,并让全部人可以使用的话,很容易想到的一点是,利用服务器。但是服务器的成本较高,而且部署的过程也比较繁杂,那么有没有什么好的方式可以帮我们实现本地的服务id映射到公网访问呢?答案就是内网穿透


这里给大家介绍一个快捷的内网穿透工具,花生壳。大家可以直接去搜索下载哦。


下载好之后我们只需要把我们本机的ip输入进去,他就会帮我们生成一个域名,实现公网可访问,如下图。


image.png

image.pngimage.png12.总结

到这里对于博客的编写与内网穿透的实践就介绍完了!总体来说要上手Flask这个框架的话还是不难的,但重要的是当你想学习一样东西的时候就要坚持下去,努力了就会有回报!需要获取完整源码的同学也可以关注下方的公众号给我留言哦🏭


文章知识点与官方知识档案匹配,可进一步学习相关知识

Python技能树Web应用开发 Flask12080 人正在系统学习中


相关文章
|
5天前
|
API 数据库 数据安全/隐私保护
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】Django REST framework (DRF) 是用于构建Web API的强力工具,尤其适合Django应用。本文深入讨论DRF面试常见问题,包括视图、序列化、路由、权限控制、分页过滤排序及错误处理。同时,强调了易错点如序列化器验证、权限认证配置、API版本管理、性能优化和响应格式统一,并提供实战代码示例。了解这些知识点有助于在Python面试中展现优秀的Web服务开发能力。
22 1
|
2天前
|
数据采集 存储 人工智能
【Python+微信】【企业微信开发入坑指北】4. 企业微信接入GPT,只需一个URL,自动获取文章总结
【Python+微信】【企业微信开发入坑指北】4. 企业微信接入GPT,只需一个URL,自动获取文章总结
13 0
|
2天前
|
人工智能 机器人 API
【Python+微信】【企业微信开发入坑指北】3. 如何利用企业微信API给微信群推送消息
【Python+微信】【企业微信开发入坑指北】3. 如何利用企业微信API给微信群推送消息
6 0
|
2天前
|
缓存 人工智能 API
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
6 0
|
5天前
|
SQL 中间件 API
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】**Flask是Python的轻量级Web框架,以其简洁API和强大扩展性受欢迎。本文深入探讨了面试中关于Flask的常见问题,包括路由、Jinja2模板、数据库操作、中间件和错误处理。同时,提到了易错点,如路由冲突、模板安全、SQL注入,以及请求上下文管理。通过实例代码展示了如何创建和管理数据库、使用表单以及处理请求。掌握这些知识将有助于在面试中展现Flask技能。**
12 1
Flask框架在Python面试中的应用与实战
|
6天前
|
数据安全/隐私保护 Python
Python Flask-Mail实现邮件发送
Python Flask-Mail实现邮件发送
|
7天前
|
前端开发 Java Go
开发语言详解(python、java、Go(Golong)。。。。)
开发语言详解(python、java、Go(Golong)。。。。)
|
9天前
|
监控 安全 数据库
Flask应用部署指南:从开发到生产环境
【4月更文挑战第16天】本文是Flask应用从开发到生产的部署指南,涵盖开发环境准备、应用开发、部署方案选择、生产环境配置、应用部署、监控与维护。确保安装Python、Flask及依赖库,使用文本编辑器或IDE编写代码,关注应用安全与性能。选择WSGI服务器、Docker或云服务平台部署,配置生产环境,确保安全性,然后部署应用并进行监控维护,定期更新修复问题,保证应用稳定运行。
|
11天前
|
数据库 开发者 Python
Python中使用Flask构建简单Web应用的例子
【4月更文挑战第15天】Flask是一个轻量级的Python Web框架,它允许开发者快速搭建Web应用,同时保持代码的简洁和清晰。下面,我们将通过一个简单的例子来展示如何在Python中使用Flask创建一个基本的Web应用。
|
SQL 关系型数据库 MySQL
Flask全套知识点从入门到精通,学完可直接做项目(四)
Flask全套知识点从入门到精通,学完可直接做项目(四)
130 0
Flask全套知识点从入门到精通,学完可直接做项目(四)