设计目的:
搭建一个自己的博客,在上面记录下自己的学习历程,心得体会以及各路大神的经验分享。
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,网络上的教程参考了不少,官方文档看的头都大了,最后还有目录和全文浏览没有实现,暂时还没有想到具体实现的步骤方法。