前言
Flask是一个使用python编写的轻量级Web框架,对比其他相同类型的框架而言,这个框架更加的灵活轻便。并且具有很强的定制性,用户可以根据自己的需求添加功能,有强大的插件库,这也是为什么这个框架在python领域一直火热的原因。这篇文章我们将使用这个框架编写一个属于自己的博客网站!并教你如何通过使用内网穿透工具处理项目,让本地的项目可以在公网访问!
文章目录
1.个人的注册与登录模块
2.首页文章展示模块
3.文章详情展示模块
4.文章发布模块
5.文章添加分类模块
6.文章分类管理模块
7.文章管理模块
8.用户个人信息注销模块
9.信息管理模块
10.程序启动模块
11.内网穿透模块
12.总结
????首先来看看我们开发的博客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)
@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"))
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
到这里我们的博客项目相关模块就编写完成啦,其实还有很多的功能小伙伴们可以根据自己的需求添加,这也是Flask极具特色的一个地方,这里要说明的一点是,由于前端部分的代码太多啦,这里就不展示出来了,需要的小伙伴可以私聊我拿到整体的代码哟。
11.内网穿透模块
这个模块对于很多小伙伴来说可能比较陌生,这里举一个例子方便小伙伴们理解。
假如说我们要把上面写好的项目进行部署,并让全部人可以使用的话,很容易想到的一点是,利用服务器。但是服务器的成本较高,而且部署的过程也比较繁杂,那么有没有什么好的方式可以帮我们实现本地的服务id映射到公网访问呢?答案就是内网穿透
这里给大家介绍一个快捷的内网穿透工具,花生壳。大家可以直接去搜索下载哦。
下载好之后我们只需要把我们本机的ip输入进去,他就会帮我们生成一个域名,实现公网可访问,如下图。
12.总结
到这里对于博客的编写与内网穿透的实践就介绍完了!总体来说要上手Flask这个框架的话还是不难的,但重要的是当你想学习一样东西的时候就要坚持下去,努力了就会有回报!需要获取完整源码的同学也可以关注下方的公众号给我留言哦????
文章知识点与官方知识档案匹配,可进一步学习相关知识
Python技能树Web应用开发 Flask12080 人正在系统学习中