激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 使用Python+Flask開發博客項目并實現內網穿透

使用Python+Flask開發博客項目并實現內網穿透

2022-02-25 13:16大數據小禪 Python

Flask是一個使用python編寫的輕量級Web框架,這篇文章我們將使用這個框架編寫一個屬于自己的博客網站!并教你如何通過使用內網穿透工具處理項目,讓本地的項目可以在公網訪問,感興趣的可以了解一下

前言

Flask是一個使用python編寫的輕量級Web框架,對比其他相同類型的框架而言,這個框架更加的靈活輕便。并且具有很強的定制性,用戶可以根據自己的需求添加功能,有強大的插件庫,這也是為什么這個框架在python領域一直火熱的原因。這篇文章我們將使用這個框架編寫一個屬于自己的博客網站!并教你如何通過使用內網穿透工具處理項目,讓本地的項目可以在公網訪問!

首先來看看我們開發的博客Web項目的一些展示

使用Python+Flask開發博客項目并實現內網穿透

使用Python+Flask開發博客項目并實現內網穿透

項目主要包含主要以下功能:個人注冊于登錄,首頁文章展示,文章詳情展示,文章發布模塊,文章添加分類模塊,文章分類管理模塊,用戶信息管理模塊,程序啟動模塊。

下面我們對各個模塊的代碼進行編寫

 

1.個人的注冊與登錄模塊

這個模塊的主要讓用戶進行用戶的注冊,之后判斷輸入的密碼是否一致,并將結果寫入到數據庫。

使用Python+Flask開發博客項目并實現內網穿透

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進行前端頁面的開發,可以讓我們在不具備很好的前端知識的情況下也可以開發出精美的頁面。

使用Python+Flask開發博客項目并實現內網穿透

@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進行精準展示

使用Python+Flask開發博客項目并實現內網穿透

@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的語法進行文章發編寫與發布,同時增加右邊的語法預覽框方便用戶看到文章的展示情況

使用Python+Flask開發博客項目并實現內網穿透

@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':
      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.文章添加分類模塊

這個模塊,用戶可以自己輸入要增加的分組的名稱,之后可以選擇分組要展現的顏色進行展示,并把相關數據存入數據庫

使用Python+Flask開發博客項目并實現內網穿透

@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.文章分類管理模塊

這個模塊主要是對用戶編輯的分組與顏色進行編輯與刪除的管理功能

使用Python+Flask開發博客項目并實現內網穿透

@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.文章管理模塊

這個模塊提供了文章的管理功能,用戶如果對已經發布的文章有繼續改進的想法可以在這個模塊進行編輯,并對文章進行刪除或者編輯重新發布的操作。

使用Python+Flask開發博客項目并實現內網穿透

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

應用程序主類

使用Python+Flask開發博客項目并實現內網穿透

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輸入進去,他就會幫我們生成一個域名,實現公網可訪問,如下圖。

使用Python+Flask開發博客項目并實現內網穿透

之后到瀏覽器測試是否可以訪問,可以成功訪問即代表映射成功:

使用Python+Flask開發博客項目并實現內網穿透

 

12.總結

到此這篇關于使用Python+Flask開發博客項目并實現內網穿透的文章就介紹到這了,更多相關Flask開發博客項目并內網穿透內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/weixin_45574790/article/details/121164856

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: chinesehd天美原创xxxx | 少妇一级淫片免费看 | 中文字幕在线看第二 | 最近免费中文字幕在线视频2 | 精品国产91一区二区三区 | 国产91中文字幕 | 国产一区二区欧美精品 | 日韩精品久久久久久久九岛 | 99久久精品日本一区二区免费 | 亚洲综合精品 | 精品国产一级毛片 | 国产午夜电影 | 久久精品国产99国产精品亚洲 | 国外成人在线视频 | 91精品国产91久久久 | 福利在线小视频 | 国产婷婷一区二区三区 | 伊人久久电影网 | 操操操操操 | 天天舔天天插 | 日韩精品中文字幕一区二区三区 | 国产免费高清在线视频 | 九九精品久久 | 日本一区二区三区精品 | 成人午夜精品久久久久久久蜜臀 | 中文字幕极速在线观看 | 久久99亚洲精品久久99果 | av成人在线免费观看 | 国产在线播放91 | 奇米影视亚洲春色 | 欧美成人理论片乱 | 97视频一二区 | 鲁丝片一区二区三区免费入口 | 日韩蜜桃视频 | 久久精品一区二区三区不卡牛牛 | 五月婷六月丁香狠狠躁狠狠爱 | 久章草在线观看 | 91网站在线播放 | 日本黄色一级视频 | 99久久婷婷国产综合精品青牛牛 | av在线免费看网站 |