小白的第一次flask编程

设计目的:

  搭建一个自己的博客,在上面记录下自己的学习历程,心得体会以及各路大神的经验分享。

  PS:有了CSDN我为啥还需要自己搭建呢,当然是为了好玩啊,练练手还是不错的。


准备工作:

  1、virtualenv(虚拟环境)的安装和使用

    在cmd中找到python编译器的路径,键入:

pip install virtualenv
    等待安装完成后,新建我们准备搭载虚拟环境的文件夹Blog,在cmd下进入文件夹根目录,键入:
python -m virtualenv flask
    完成后发现在Blog目录下生成了flask文件夹,文件夹里面就是我们搭建好的虚拟环境。

  2、安装Flask

    在环境变量中添加新建的虚拟环境的路径,在cmd中进入flask文件夹目录,用pip进行Flask的安装

pip install flask
pip install flask-sqlalchemy
pip install flask-wtforms
  3、安装mysql

    在官网下载mysql,本次编程使用的是mysql 5.7版本,同时安装可视化界面程序workbench。

    注:mysql 5.7版本需要VC2013的环境。

    在python中安装mysql的api接口pymysql

pip install pymysql

初始化:

    新建app文件夹作为本次的应用程序包,在app目录下写上第一个python脚本'__init__.py',用作初始化

from flask import Flask

app = Flask(__name__)

from app import views, models
    当一个文件夹下有'__init__.py'文件时,这个文件夹才会被python视为一个包(lib)。

    创建一个Flask实例,views和models是后面要编写的脚本,models用于和mysql进行关联和映射,以管理和存储数据,views脚本负责视图,对前端和后端的进行连接。


编写最初的视图函数views.py(在app目录下创建):

def index():
  return "Hello!"
    

编写运行脚本run.py(在flask根目录下创建):

from app import app

app.run(debug = True)
    debug = True表示开启调试模式,调试模式下可以看到运行报错的提示,而不是我们通常所见的error:404。

    运行run.py,在浏览器内输入‘localhost:5000’回车,可以发现在view.py中写入的'Hello'已经显示在了页面上。


设计web前端index.html(在app目录下创建):


  

    Area1:文章的目录

    Area3 - 8 :显示最近发布的文章

    底部:用于发布文章

    以上可用dreamveaver实现,比较简单,代码行数较多,不展示了。

  
web前端和视图脚本views的连接:

from flask import render_template

def index():
  return render_template('index.html')


    render_template用于web前端的连接和参数传递,再次运行run.py,进入localhost:5000页面,发现之前的Hello已经替换成了自己设计的html页面。


表单的创建:

  我们已经有个了网页框架,接下来就是功能的实现,我们需要编写文章,并把文章发布,表单就是处理数据提交的一种方式。

  在app目录下新建forms.py脚本用来管理表单

from flask_wtf import Form
from wtforms import StringField, TextAreaField

class DistributeForm(Form):
    headline = StringField()
    article = TextAreaField()
  从flask_wtf中导入表单的基类Form,定义一个子类DistribuForm,headline是题目,article是正文

  我们已经写了一个用于发布文章的DistributeForm表单,接下来就是如何使用的问题。

  针对使用,先更新views.py的相关代码

from flask import render_template
from forms import DistributeForm

def index():
  form = DistributeForm()
  return render_template('index.html',
                        form = form)
  在view.py中导入之前写好的DistributeForm类,将其实例化,在render_template中把实例Form作为参数传递给web前端。

  在web前端写入表单:

...
<body>
  <form action='' method='post' name='dist'>
      title:<br>
      {{ form.headline(size=50,maxlength=50)}}<br>
      text:<br>
      {{ form.article(cols=150,rows=10)}}
      <input type='submit' value='submit'>
  </form>
</body>
  创建了一个post方法的表单,双花括号{{}}当中的值就是通过render_template传递过来的Form参数的调用,然后input了一个提交按钮

  当我们点击提交按钮,就会发送一个请求,接下来要做的就是如何接收请求,并处理请求当中的表单数据。


连接mysql数据库:

  在接受请求之前,先建立一个数据库用来存储将要接受的表单数据。

  在models.py中进行数据库的连接,并且创建一个Tables:

from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base

mysql_engine = create_engine('mysql+pymysql://mysql用户名:mysql密码@localhost:3306/数据库名')
Base = declarative_base()

class Knowledge(Base):
        __tablename__ = 'text'

        id = Column(Integer, primary_key = True)
        title = Column(String(50))
        profile = Column(String(50))
        hole = Column(String(200))
			
Base.metadata.create_all(mysql_engine)
  sqlalchemy是一种ORM(对象关系映射)工具,通过sqlalchemy,我们可以把sql查询当作对象进行调用,极其方便。

  create_engine方法帮我们实现了python和mysql的连接,之后我们导入了一个基类declarative_base,这个基类帮助我们实现类到表的映射。

  声明一个Knowledge子类,继承自Base,在类中定义我们要使用的表的详细信息。

  最后调用create_all方法,将在mysql中创建上面定义的数据库表。

(PS:最后这一步卡了我一天,因为,因为sqlalchemy的文档中关于声明映射的代码和说明根本没有提到这个create_all.........,害的我一直以为数据库连接失败。)


将提交的表单数据存入数据库:

  做完这一步基本上就已经大功告成了,在views.py中更新代码

from flask import render_template, request, redirect, url_for
from forms import DistributeForm
from app import app
from models import Knowledge
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

mysql_engine = create_engine('mysql+pymysql://mysql用户名:密码@localhost:3306/数据库名')
Session = sessionmaker(bind = mysql_engine)
session = Session()

@app.route(methods = ['GET','POST'])			
def index():
        form = DistributeForm()
	if request.method == 'POST':
        ourtext = Knowledge(title = form.headline.data, profile = form.article.data[:30], hole = form.article.data)
		session.add(ourtext)
		session.commit()
		return redirect(url_for('index'))	
        return render_template('index.html',
                form = form)	
  @app.route()是一个装饰器,作用是让index方法处理get和post请求

  request是flask当中用于暂时存储数据,当接受到的请求为POST,即我们在前端提交表单时,我们把表单中的数据存入数据库当中。

  session是用来与数据库进行“交谈”,我们用add方法把表单数据添加到数据库,用commit方法告诉数据库刷新数据。

  redirect重定向,可以清空我们的表单数据,因为我们一旦存储后,就不需要在把数据留在表单当中了。


最近发布的文章显示:

    我们要把最近发布的文章显示在web上,换句话说,就是把mysql中存储的数据传递到html页面当中去。

    我们在数据库表中定义了id字段,它是一个自增的字段,我们选定id字段进行倒序排序,最前面的就是我们最新发布的内容,然后把它通过render_template传递到html页面就大功告成啦

@app.route( methods = ['GET','POST'])			
def index():
        text = []
        form = DistributeForm()
	if request.method == 'POST':
        ourtext = Knowledge(title = form.headline.data, profile = form.article.data[:30], hole = form.article.data)
		session.add(ourtext)
		session.commit()
		return redirect(url_for('index'))
        for i in range(4):
		eachtext = session.query(Knowledge).order_by(desc(Knowledge.id))[i]
		text.append(eachtext)	
        return render_template('index.html',
                form = form,
                text1 = text[0],
                text2 = text[1],
                text3 = text[2],
                text4 = text[3])
  偷懒用了蠢办法。。。。。。其实应该在html页面的代码当中写入循环来依次提取每一行的数据。

  html页面的代码更新与表单那一节的方法相同。


总结:

  前前后后写了好几天,毕竟是第一次接触flask,网络上的教程参考了不少,官方文档看的头都大了,最后还有目录和全文浏览没有实现,暂时还没有想到具体实现的步骤方法。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值