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

目录
  • 前言
  • 1.个人的注册与登录模块
  • 2.首页文章展示模块
  • 3.文章详情展示模块
  • 4.文章发布模块
  • 5.文章添加分类模块
  • 6.文章分类管理模块
  • 7.文章管理模块
  • 8.用户个人信息注销模块
  • 9.信息管理模块
  • 10.程序启动模块
  • 11.内网穿透模块
  • 12.总结

前言

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

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

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

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

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进行精准展示

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

    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

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)

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

11.内网穿透模块

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

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

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

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

之后到浏览器测试是否可以访问,可以成功访问即代表映射成功:

12.总结

到此这篇关于使用Python+Flask开发博客项目并实现内网穿透的文章就介绍到这了,更多相关Flask开发博客项目并内网穿透内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Flask入门教程实例:搭建一个静态博客

    现在流行的静态博客/网站生成工具有很多,比如 Jekyll, Pelican, Middleman, Hyde 等等,StaticGen 列出了目前最流行的一些静态网站生成工具. 我们的内部工具由 Python/Flask/MongoDB 搭建,现在需要加上文档功能,写作格式是 Markdown,不想把文档放到数据库里,也不想再弄一套静态博客工具来管理文档,于是找到了 Flask-FlatPages 这个好用的 Flask 模块.熟悉 Flask 的同学花几分钟的时间就可以用搭建一个简单博客,加

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

    目录 前言 1.个人的注册与登录模块 2.首页文章展示模块 3.文章详情展示模块 4.文章发布模块 5.文章添加分类模块 6.文章分类管理模块 7.文章管理模块 8.用户个人信息注销模块 9.信息管理模块 10.程序启动模块 11.内网穿透模块 12.总结 前言 Flask是一个使用python编写的轻量级Web框架,对比其他相同类型的框架而言,这个框架更加的灵活轻便.并且具有很强的定制性,用户可以根据自己的需求添加功能,有强大的插件库,这也是为什么这个框架在python领域一直火热的原因.这篇

  • 用python写个博客迁移工具

    前言 最近不少写博客的朋友跟我反馈博客园的一些文章下架了,这让我联想到去年简书一样,我之前写的博客都被下架不可见了. 我最开始接触的博客网址是 csdn.思否.简书还有博客园等,但是后期发现,单论博客的生态感觉做的越来越不行,干货虽然很多,但是垃圾.标题党很严重,我自己也有一些博文被莫名的搬走直接标为原创. 虽然搜问题在上面还是能搜到很多解决方案,但写作的欲望降低了很多. 综上我从去年入驻掘金,并以掘金作为博客的主平台.个人感觉掘金团队对个人原创的保护是非常好的,同时也在不断的听取用户的建议而去

  • python flask开发的简单基金查询工具

    项目地址: https://github.com/guodongggg/fund 1) 启动方法 (非必须)修改new.csv,参照test.csv,首行为基金代码,其次为每支基金在指定日期内的操作,正值为买入金额,负值为赎回份额.具体项目参照x_alpha项目 修改code_list.json文件的prodect为你自己的基金代码,修改count为每支基金的金额,执行同级目录下的update_code_list.py,自动更新持仓百分比 执行python run.py ps:初始化比较麻烦,我

  • vscode远程开发使用SSH远程连接服务器的方法「内网穿透」

    目录 1.安装OpenSSH 2.vscode配置ssh 3. 局域网测试连接远程服务器 4. 公网远程连接 4.1 ubuntu安装cpolar 4.2 创建隧道映射 4.3 测试公网远程连接 5. 配置固定TCP端口地址 5.1 保留一个固定TCP端口地址 5.2 配置固定TCP端口地址 5.3 测试固定公网地址远程 远程连接服务器工具有很多,比如XShell.putty等,可以通过ssh来远程连接服务器,但这用于写代码并不方便,可能需要现在本地写好代码后再将源代码传送到服务器运行.服务器上

  • node.js博客项目开发手记

    需要安装的模块 body-parser 解析post请求 cookies 读写cookie express 搭建服务器 markdown Markdown语法解析生成器 mongoose 操作Mongodb数据库 swig 模板解析引擎 目录结构 db 数据库存储目录 models 数据库模型文件目录 public 公共文件目录(css,js,img) routers 路由文件目录 schemas 数据库结构文件 views 模板视图文件目录 app.js 启动文件 package.json a

  • Python 自动刷博客浏览量实例代码

    思路来源 今天很偶然的一个机会,听到别人在谈论现在的"刷量"行为,于是就激发了我的好奇心.然后看了下requests模块正好对我有用,就写了一个简单的测试用例.神奇的发现这一招竟然是管用的.那还等什么,开刷咯. 前奏 思路很简单,就是一个发送请求的实现,就可以了.代码如下: headers = { 'referer':'http://jb51.net/', 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537

  • Python 批量刷博客园访问量脚本过程解析

    今早无聊...7点起来突然想写个刷访问量的..那就动手吧 仅供测试,不建议刷访问量哦~~ 很简单的思路,第一步提取代理ip,第二步模拟访问. 提取HTTP代理IP 网上很多收费的代理和免费的代理IP 如: 无论哪个网站,我们需要的就是爬取上面的ip和端口号,整理到一起. 具体的网站根据具体的结构爬取 比如上面那个网站,ip和端口在td标签 这里利用bs4爬取即可.贴上脚本 ##获取代理ip def Get_proxy_ip(): print("==========批量提取ip刷博客园访问量 By

  • Windows上使用virtualenv搭建Python+Flask开发环境

    关于virtualenv: VirtualEnv用于在一台机器上创建多个独立的Python虚拟运行环境,多个Python环境相互独立,互不影响,它能够: 1.在没有权限的情况下安装新套件 2.不同应用可以使用不同的套件版本 3.套件升级不影响其他应用 虚拟环境是在Python解释器上的一个私有复制,你可以在一个隔绝的环境下安装packages,不会影响到你系统中全局的Python解释器. 虚拟环境非常有用,因为它可以防止系统出现包管理混乱和版本冲突的问题.为每个应用程序创建一个虚拟环境可以确保应

  • Vuepress 搭建带评论功能的静态博客的实现

    vuepress 是 Vue 驱动的静态站点生成工具 本文仅介绍,搭建静态博客的过程,具体教程及文档请点击进入 vuepress中文网 点击查看项目代码 vuepress初始化 下面初始化 # 将 github 新创建的仓库克隆到本地 git clone git@github.com:zhb333/readme-blog.git # 进入项目 cd readme-blog # npm 初始化, 按照提示回车 npm init # 安装 vuepress npm i vuepress -D # 安

  • Python+ Flask实现Mock Server详情

    目录 一.Mock介绍 1.什么是Mock 2.Mock的三种典型应用场景 3.Mock的作用 4.Mock实现的3种方式 二.环境搭建 三.Mock的案例 一.Mock介绍 1.什么是Mock 模拟接口 接口Mock测试:在接口测试中,对于某些不容易构造或者不容易获取的接口,可以用一个模拟接口来代替 2.Mock的三种典型应用场景 依赖的接口未实现 依赖的接口响应速度慢 针对接口模拟各种异常 3.Mock的作用 可以用来解除测试对象对外部服务的依赖,使得测试用例可以独立运行 模拟异常逻辑,异常

随机推荐