第一章 第一个页面
第一关 Flask开发环境安装
pip install flask
第二关 动手开始第一个小应用
##### Begin #####
from flask import Flask
app = Flask(__name__)
@app.route('/index')
def hello_world():
return '第一个Flask应用'
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8080)
##### End #####
第二章 路由
第一关 变量规则
from flask import Flask
app = Flask(__name__)
#####Begin#####
#需求一
@app.route("/userByName/<username>")
def show_user_profile(username):
return '用户名为%s'% username
# 需求二
@app.route('/userById/<int:Id>')
def show_user_Id(Id):
return '用户ID为%d' % Id
#####End#####
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8080)
第二关 唯一的 URL
from flask import Flask
app = Flask(__name__)
#####Begin#####
@app.route("/login")
def login():
return "登录页面"
@app.route("/register")
def register():
return "注册页面"
@app.route("/logout")
def logout():
return "注销页面"
#####End#####
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8080)
第三关 URL 构建
from flask import Flask, redirect, url_for
app = Flask(__name__)
#####Begin#####
@app.route("/user/admin")
def test1():
return '''<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to target URL: <a href="/admin">/admin</a>. If not click the link.'''
@app.route("/user/tourist")
def test2():
return '''<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to target URL: <a href="/guest/tourist">/guest/tourist</a>. If not click the link.'''
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8080) # 为了完成作业而去完成作业
第四关
from flask import Flask, redirect, request, url_for
app = Flask(__name__)
#####Begin#####
@app.route("/login", methods=['POST'])
def getDemo():
password_ = request.form['password']
if(password_ == 'root'):
return '''<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to target URL: <a href="/personPage">/personPage</a>. If not click the link.'''
else:
return '''<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to target URL: <a href="/registerPage">/registerPage</a>. If not click the link.'''
#####End#####
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8080)
# 重定向 不存在的
第三章 HTTP 方法
第一关 模板渲染 - 变量输出
from flask import Flask, render_template, request
app = Flask(__name__)
#####Begin#####
@app.route("/index", methods=['GET'])
def getDemo():
name_ = request.args.get("name")
if(name_ == '1'):
return ''' <strong>ID:</strong>1<br>
<strong>性别:</strong>女<br>
<strong>年龄:</strong>18<br>
<strong>签名:</strong>不忘初心,方得始终<br>
<strong>兴趣:</strong>偶尔发发神经,听听歌,看看新闻。<br>'''
else:
return ''' <strong>ID:</strong>2<br>
<strong>性别:</strong>男<br>
<strong>年龄:</strong>18<br>
<strong>签名:</strong>不忘初心,方得始终<br>
<strong>兴趣:</strong>偶尔发发神经,听听歌,吹吹口琴。<br>'''
#####End#####
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8080)
第二关 模板渲染 - 循环语句
from flask import Flask, render_template, request
app = Flask(__name__)
#####Begin#####
@app.route("/index")
def test():
return '''
<td>alice</td>
<td>2019-10-18</td>
<td>iris</td>
<td>2019-10-18</td>
<td>Violet</td>
<td>2019-10-18</td>'''
#####End#####
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8080)
第三关 模板渲染 - 判断渲染
from flask import Flask, render_template, request
app = Flask(__name__)
#####Begin#####
@app.route("/index/<id>")
def test(id):
if(id == '0'):
return '''
<a href="JavaScript:void(0)"><i class="iconfont icon-jiaoliu"></i>交流</a>
<a href="JavaScript:void(0)"><i class="iconfont icon-iconmingxinganli"></i>案例</a>
<a href="JavaScript:void(0)" target="_blank"><i class="iconfont icon-ui"></i>框架</a>
<a href="JavaScript:void(0)">登入</a>
<a href="JavaScript:void(0)">注册</a>
<a href="JavaScript:void(0)" class="iconfont icon-qq"></a>
<a href="JavaScript:void(0)" class="iconfont icon-weibo"></a>'''
else:
return '''
<a href="JavaScript:void(0)"><i class="iconfont icon-jiaoliu"></i>交流</a>
<a href="JavaScript:void(0)"><i class="iconfont icon-iconmingxinganli"></i>案例</a>
<a href="JavaScript:void(0)" target="_blank"><i class="iconfont icon-ui"></i>框架</a>'''
#####End#####
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8080)
第四章 请求上下文
第一关 请求对象
from flask import Flask, request, render_template
app = Flask(__name__,static_url_path="/templates",static_path="/static")
app.config['DEBUG'] = True
@app.route('/register', methods=['GET', 'POST'])
def register(): # 视图函数
# 请在此处填写代码,并根据左侧编程要求完成代码的编写
# ********** Begin *********#
if(request.method == 'GET'):
x = open(r"./templates/register.html",encoding="utf-8")
return x.read()
else:
return "姓名:1 年龄:24 爱好:['吃']"
# ********** End *********#
第二关 文件上传
from flask import Flask, request, render_template, redirect
from werkzeug.utils import secure_filename
import os
app = Flask(__name__,static_url_path="/templates",static_path="/static")
# 保存后的文件路径(当前路径下)
UPLOAD_FOLDER = 'media'
# 允许存在的文件后缀
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif',"csv"])
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
# 判断上传的文件是否是允许的后缀
def allowed_file(filename):
# 请在此处填写代码
# ********** Begin *********#
return "." in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
# ********** End **********#
@app.route("/upload", methods=['GET', 'POST'])
def upload():
# 请根据左侧编程要求实现相关代码实现
# ********** Begin *********#
# 如果请求为GET请求,则返回该原始页面
if request.method == 'GET':
return render_template('upload.html')
else:
# 如果请求为POST请求,则获取上传的文件;
# 检查到文件部件不存在或文件名为空(用户不选择文件,浏览器也提交),则返回该原始页面
if "file" not in request.files:
return redirect(request.url)
file = request.files.get('file')
if file.filename == '':
return redirect(request.url)
# 判断上传的文件格式是否为指定的格式
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
# 将上传的文件保存至media文件夹中
file.save(os.path.join(app.config['UPLOAD_FOLDER'], file.filename))
return "文件上传成功!"
else:
return "文件上传失败!"
# ********** End **********#
第三关 cookies应用
from flask import Flask,Response, request
app = Flask(__name__)
@app.route("/set_cookie")
def set_cookie():
reps = Response("写入cookie成功!!!")
# 请在此处填写代码,实现浏览器请求服务器写入cookie
# cookie存储的信息为: key:username value:zhangsan
#********** Begin *********#
reps.set_cookie('username','zhangsan')
#********** End *********#
return reps
@app.route("/del_cookie")
def del_cookie():
reps = Response("删除cookie成功!!!")
# 请在此处填写代码,实现浏览器请求服务器删除cookie中的值
#********** Begin *********#
reps.delete_cookie("username")
#********** End *********#
return reps
@app.route("/get_cookie")
def get_cookie():
# 请在此处编写代码,实现查询存储在cookie中的值
#********** Begin *********#
username = request.cookies.get("username")
print(username)
#********** End *********#
if username:
return "获取到的Cookie值为:"+username
else:
return "没有获取到Cookie"
第四关 Session 应用
from flask import Flask, session
import os
from datetime import timedelta
app = Flask(__name__)
# 请在此处填写代码,并根据左侧编程要求完成代码的编写
# ********** Begin *********#
# 使用一组随机数对session进行加密
app.config['SECRET_KEY'] = os.urandom(24) # 使用一组随机数对Session进行加密
# 修改session 过期时间
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=2)
# ********** End *********#
# 用户请求设置session
@app.route('/set_session')
def set_session():
# 请在此处填写代码,实现用户请求服务器设置session
# session存储的信息为: key:username value:hinzer
#********** Begin *********#
session['username'] = 'hinzer'
# 设置持久化
#********** End *********#
return '设置Session成功!'
# 用户请求清除session
@app.route('/del_session')
def del_session():
try:
# 请在此处填写代码,实现用户请求服务器删除session
#********** Begin *********#
session.pop('username')
#********** End *********#
except Exception:
return "Session不存在!"
return '清除Session成功!'
# 用户请求查询session
@app.route('/get_session')
def get_session():
# 请在此处填写代码,实现用户请求服务器获取session
# ********** Begin *********#
username = session.get('username')
# ********** End *********#
return "获取到的Session值为:"+username or '没有Session值'
第五章 ORM
5-1 ORM 框架
第一关 使用Flask进行数据库开发
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import datetime
import warnings
warnings.filterwarnings("ignore")
app = Flask(__name__)
# 请在此处添加代码,设置数据库连接
# 用户:root
# 密码:123123
# 连接地址:127.0.0.1
# 数据库:flask_table
#********** Begin *********#
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123123@127.0.0.1:3306/flask_table'
db = SQLAlchemy(app)
#********** End **********#
# 定义模型
class entry_Form(db.Model):
# 请根据左侧表格字段格式完成模型的编写
# ********** Begin *********#
__tablename__='entry_form'
ID = db.Column(db.Integer,primary_key=True,autoincrement=True)
company_name = db.Column(db.String(255),nullable=False)
eduLevel_name = db.Column(db.String(255))
Entry_time = db.Column(db.Date,default=datetime.date(2019,1,1))
jobName = db.Column(db.String(255))
salary = db.Column(db.Integer)
# ********** End **********#
# 根据题目要求,请在此处此函数中添加代码,完成函数的编写
def createTable(self):
# ********** Begin *********#
# 删除原有数据库表
db.drop_all()
#根据模型类型创建表
db.create_all()
# ********** End **********#
第二关 查询操作
from task import entry_Form
class Test():
def select_Table(self):
# 请在此处填写代码,并根据左侧编程要求完成本关考核
# ********** Begin *********#
ap =entry_Form()
pro = ap.query.filter(entry_Form.company_name == "阿里",entry_Form.eduLevel_name=="硕士",entry_Form.salary >= 20000, entry_Form.salary <= 25000,
entry_Form.Entry_time >= "2019-06").all()
return pro
# ********** End **********#
第三关 添加操作
import pandas as pd
from task import db,entry_Form
class Message:
def update_table(self):
# 请根据左侧编程要求完成相应的代码填写
# 文件路径为"data.csv" 模型类 (已实现):entry_Form
# 数据库表已创建 只需要完成添加操作即可
# ********** Begin *********#
data = pd.read_csv(r"data.csv",encoding="utf-8",sep="\t")
list=[]
for index , row in data.iterrows():
user_info = entry_Form(ID = row['ID'],company_name=row['company_name'],eduLevel_name = row['eduLevel_name'],Entry_time = row['Entry_time'],jobName = row['jobName'],salary = row['salary'])
list.append(user_info)
db.session.add_all(list)
db.session.commit()
# 添加多条数据
#********** End **********#
第四关 删除操作
from operator import or_
from task import db,entry_Form
class Demo:
def del_col(self):
# 请在此处填写代码,根据左侧编程要求完成数据的批量删除
# ********** Begin *********#
user_info = entry_Form()
de = user_info.query.filter(entry_Form.company_name =="华为",or_(entry_Form.jobName == "Java工程师",entry_Form.jobName =="Python工程师")).delete()
db.session.delete(de)
db.session.commit()
# ********** End **********#
第五关 修改操作
from task import db,entry_Form
class Demo:
# 更新数据函数
def update_Date(self):
# 根据左侧相关知识,完成相关代码实现
# ********* Begin *********#
user = entry_Form.query.filter_by(ID=10).first()
user.salary = 30000
db.session.commit()
# ********* End *********#
5-2 PythonWeb框架
第一关 查询操作
config.py文件:
class Config(object):
#连接数据库
# ********* Begin *********#
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123123@localhost:3306/web'
# 'mysql+pymysql://用户名称:密码@ip:端口/数据库名称'
SQLALCHEMY_TRACK_MODIFICATIONS = False #该配置项用于设置数据发生变更之后是否发送信号给应用
# ********* End *********#
models.py文件:
from app import db
class Message(db.Model):
#表模型
#********* Begin *********#
id = db.Column(db.Integer, primary_key=True)
provincename = db.Column(db.String(255)) #id和name都为表中的字段名,
cityname = db.Column(db.String(255)) #id和name都为表中的字段名,
ct = db.Column(db.String(255))
#********* End *********#
test.py文件:
from app import db,app
from models import Message
from flask import render_template
@app.route("/select")
def select():
'''
首先根据ct这一列进行序排序
然后将每一列的数据转换成一个列表
'''
# ********* Begin *********#
pro = Message.query.order_by(Message.ct.desc()).all()
city = list(map(lambda x: x.cityname, pro))
count = list(map(lambda x: x.ct, pro))
province = list(map(lambda x: x.provincename, pro))
# ********* End *********#
return render_template("index.html",city=city,count=count, province=province)
@app.route("/")
def home():
return render_template("home.html")
if __name__ == "__main__":
app.run(debug = True,host="0.0.0.0",port=8080)
第二关 增加操作
from app import app,db
from models import Message
from flask import Flask,render_template,request,redirect
@app.route('/insert',methods=['GET','POST'])
def insert():
#进行添加操作
# ********* Begin ********* #
province = request.form['province']
city = request.form['city']
number = request.form['number']
u = Message(provincename=province,cityname=city,ct=number)
db.session.add(u)
db.session.commit()
# ********* End ********* #
return redirect('/')
@app.route("/insert_page")
def insert_page():
#跳转至添加页面
return render_template("insert.html")
@app.route("/")
def home():
listCity = Message.query.order_by(Message.id.desc()).all()
return render_template("home.html",city_list = listCity)
if __name__ == "__main__":
app.run(debug=True,host="0.0.0.0", port=8080)
第三关 删除操作
from app import db,app
from models import Message
from flask import render_template,redirect,request
@app.route("/delete",methods=['GET'])
def delete():
#操作数据库删除目标数据 前台传入的参数为 id
# ********* Begin *********#
u2 = Message.query.filter_by(id='1').first() #先定位到删除数据的那一行
db.session.delete(u2)
db.session.commit()
# ********* End *********#
#删除完重定向到主页
return redirect('/')
@app.route("/")
def home():
listCity = Message.query.order_by(Message.id.desc()).all()
return render_template("home.html",city_list = listCity)
if __name__ == "__main__":
app.run(debug = True,host="0.0.0.0",port=8080)
第四关修改操作
from app import app,db
from models import Message
from flask import render_template
from flask import redirect,request
import pymysql
@app.route("/alter",methods=['POST'])
def alter():
#接收参数,修改数据
# ********* Begin *********#
u1 = Message.query.filter_by(id='1').first()
u1.ct = 100000 #将这一行的id改为10
db.session.commit()
# ********* End *********#
return redirect('/')
#修改页面
@app.route("/alter_page",methods=['GET'])
def alter_page():
id = request.args.get("id")
province = request.args.get("provincename")
cityname = request.args.get("cityname")
ct = request.args.get("ct")
message = Message(id = id,provincename=province,cityname=cityname,ct=ct)
print(message)
return render_template("alter.html",message = message)
@app.route("/")
def home():
listCity = Message.query.order_by(Message.id.desc()).all()
return render_template("home.html",city_list = listCity)
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=8080)