目录
1、flask安装:pip install 或pycharm的setting设置里添加
2、flask初体验
3、flask使用html
将静态的html文件传入示例:
将数据传输到html文件中显示示例:
添加图片或者css、js文件:
4、多网页开发和链接的方法。
网页之间的链接实现(a超链接):
5、flask实现表单数据传输
6、公用变量存储使用
7、flask连接数据库读取数据
8、flask蓝图及模板使用
9、flask框架公共页面模板
*问题解决
1、报错jinja2.exceptions.TemplateNotFound
2、报错werkzeug.routing.BuildError: Could not build url for endpoint 'productpage'. Did you forget to specify values ['a']?
3、获取静态资源static404(static文件夹和运行的py文件需在同一级目录)
5、报错OperationalError sqlite3.OperationalError: table news already exists
Flask是一个用Python编写的Web应用程序框架。Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。两者都是Pocco项目。在此使用flask搭建一个较为简单的web网站。
运行脚本,访问http://127.0.0.1:2022即可看到页面内容
from flask import Flask
app=Flask(__name__) # 创建对象
@app.route('/') # 编写路由
def index():
return 'hello world!' #页面内容
#可以是html
#return'hello world!
html测试
'
if __name__=="__main__":
#以调试模式启动项目
app.run(port=2022,host="127.0.0.1",debug=True)
在return里语句加入html长串代码并不合适,可以用flask库里的Jinja2模板引擎,调用flask模块里的render_template方法,将静态的html文件传入。
*默认去寻找项目文件夹下的templates文件夹里的html文件。
from flask import Flask,render_template #导入render_template模块
app=Flask(__name__)
@app.route('/')
def index():
return render_template("index.html") #调用render_template函数,传入index.html文件
if __name__=="__main__":
app.run(port=2022,host="127.0.0.1",debug=True)
from flask import Flask,render_template
app=Flask(__name__)
@app.route('/')
def index():
msg="三个关键词,解读为何确信进博会“越办越好”"
return render_template("index.html",data=msg) #传入变量
if __name__=="__main__":
app.run(port=2022,host="127.0.0.1",debug=True)
用flask框架默认设置的static目录方式,即将这些图片、css、js文件存放到项目目录下的static目录,然后使用路由指向。因此首先在项目目录下新建一个static文件夹,然后在里面新建一个img目录,存入一张图片名为my.jpg。在页面中使用的时候方式如下:
增加多个网页的路由和调用函数:
# -*- coding: utf-8 -*-
"""
@ Author :zplin
@ Date : 2022/11/7
"""
from flask import Flask,render_template
app=Flask(__name__)
@app.route('/')
def index():
msg='三个关键词,解读为何确信进博会“越办越好”'
return render_template('index.html',data=msg)
@app.route('/news') #增加一个页面news
def newspage():
newContent='这个是另外增加的一个页面!'
return render_template('news.html',data=newContent)
@app.route('/product/',methods=['GET']) #增加一个product页面
def productpage(a):
return render_template("product.html",data=a)
if __name__ == '__main__':
app.run(port=2022,host='127.0.0.1',debug=True)
a超链接的href属性构建路由方式:
1、通过url_for函数,href="{{ url_for('productpage') }}",productpage为路由页面的函数名;
#回首页超链接
#产品页链接
在html中设计一个表单输入,
用户登录页面
form中的action路由指向为loginProcess,我们在运行脚本py中增加这个路由装饰器及对应的函数:
@app.route('/loginProcess',methods=['POST','GET'])
def loginProcesspage():
if request.method=='POST':
nm=request.form['nm']
pwd=request.form['pwd']
#mm替换为pwd
if nm=='lin' and mm=='':
session['username']=nm #使用session存储方式,session默认为数组,给定key和value即可
return redirect(url_for('index')) #重定向跳转到首页
else:
return 'the username or userpwd does not match!'
由于涉及表单数据的接收,此时就需要导入flask的request包,调用其form属性,具体用法如下:
data=request.form #data为一个接收表单的数组对象,即整个表单
name=request.form['nm'] #接收到用户名文本框的输入并赋值给name变量
对于页面之间的共同需要使用的变量,可以使用缓存技术保存在浏览器中,也可以在服务器端存储到数据库里后面再取用。除了采用session会话、cookie等缓存技术外,flask框架也提供了处理上下文的方式全局g对象和context处理。
1、g对象直接赋予其属性即可。如g.name、g.attrs等。
from flask import g
g.name='lin'
2、context上下文处理可以在局部也可以在全局。全局公用变量例子:
@app.context_processor
def common():
isLogin=False
return isLogin
#isLogin变量可以在项目业务中通用
使用python中自带sqlite轻量型数据库结合flask实现,新建db.by文件封装数据库操作方法
# -*- coding: utf-8 -*-
"""
@ Author :zplin
@ Date : 2022/11/8
"""
##数据库业务脚本
##python中自带sqlite轻量型数据库
class dbUtils:
def __init__(self, dbName): # 连接数据库
import sqlite3
self.conn = sqlite3.connect(dbName)
def db_action(self, sql, actionType=0): # 进行相关业务操作
try:
res = self.conn.execute(sql)
if actionType == 1: # 当操作类型为1时代表为查询业务,返回查询列表
return res.fetchall()
else: # 当操作类型不为1时代表为新增、删除或更新业务,返回逻辑值
return True
except ValueError as e:
print(e)
def close(self): # 关闭数据库
self.conn.commit()
self.conn.close()
#1.创建数据库
db=dbUtils('web2022.db')
#2.创建新闻表
sql='create table if not exists news (newsid int, content text, author text)'
if db.db_action(sql,0)==True:
print("创建新闻表成功!")
else: print("try again1")
#3.新增新闻
# sql= "insert into news values(1,'秋粮丰收又一年 全国秋粮已收获12.37亿亩','lin')," \
# "(2,'两部门建立突发生态环境事件应急联动机制','lin')"
# if db.db_action(sql,0)==True:
# print("新增新闻表成功!")
# else: print("try again1")
# db.close()
在对应页面路由方法里查询数据库
@app.route('/news') #增加一个页面news
def newspage():
import dbutil #导入dbutil模块,即数据库业务
db=dbutil.dbUtils('web2022.db') #链接指定数据库
sql='select distinct content from news' #组装查询sql语句
newslist=db.db_action(sql,1) #查询处理并返回列表
db.close() #关闭数据库
return render_template("news.html",data=newslist) #将数据传递到news.html页面中
在对应页面html中显示读取到的数据
{% for item in data %} #采用循环来读取列表中的内容
{{item}}
{% endfor %}
蓝图是flask框架为解决项目框架搭建的工具。可以使用flask框架提供的blueprint类来实现分业务来配置路由及模型。
按业务新建py文件,文件里使用blueprint蓝图模块,例:
from flask import Blueprint, render_template
#蓝图使用方法,参数里给定文件名product,还可以给定url前缀
product=Blueprint('product',__name__)
@product.route('/product')
def productpage():
return render_template("product.html")
在主路由文件中将上述的文件采用蓝图注册方式导入即可。
from flask import Flask, render_template, url_for, request, redirect, session
from news import news #导入news蓝图
from user import user #导入user蓝图
from product import product #导入product蓝图
app=Flask(__name__)
app.secret_key='any random string'
urls=[news,user,product] #将三个路由构建数组
for url in urls:
app.register_blueprint(url) #将三个路由均实现蓝图注册到主app应用上
@app.route('/')
def index():
userinfo=''
return render_template("index.html",data=userinfo)
if __name__=="__main__":
print(app.url_map) #打印url结构图
app.run(port=2020,host="127.0.0.1",debug=True)
在templates文件夹(即存放html网页的文件夹)里新建一个common.html,即公用模板html文件,写入代码如下:
{% block title %}Title {% endblock %}
{% block header %}
#头部区域的导航
- 首页
- 最近新闻
- 最新产品
- 人力需求
- 联系我们
{% endblock %}
{% block container %} #中部内容块区域
中部业务内容
{% endblock %}
{% block footer %} #底部区域
{% endblock %}
在各个页面使用的时候采用 {% extends 'common.html' %}将模板导入。例如将上述案例中的product.html文件修改一下,使用模板方式创建:
{% extends 'common.html' %} #导入模板文件
{% block title %}产品页面 {% endblock %} #修改模板中的网页标题内容部分
其他页面都可以去单独修改中部内容区域的html代码就行了。这样头尾都较为固定的样式使得整个网站规格和风格较为统一。
1、项目下存在templates文件夹,html文件已放入;
2、templates文件夹和运行的py文件在同一级目录;
3、render_template('***.html')检查html文件名;
1、news.html中href="{{ url_for('productpage',a=50) }}忘记写参数a;
在Flask对象app下面设置SECRET_KEY:app.secret_key = 'xxxxxxx'
数据库sqlite建的表已存在,检查脚本的sql