头歌-Flask快速入门

1,425 阅读7分钟

第一章 第一个页面

第一关 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)