Python基本功:Flask后端框架的使用

flask的基本配置

  • pip install flask

  • flask是一个轻量级python框架

  • import flask

  • from flask import Flask


网站入口点

  • 网站使用主函数作为入口
if __name__=="__main__":    
app.run( ) 
# app为定义的flask应用
main( )

创建第一个flask程序

# 创建一个flask程序
app = Flask(__name__)

路由

  • 路由 = 什么路径可以访问到什么资源
  • python中的路由是使用装饰器进行执行的
  • 新建一个路由
# 装饰器,把下面的函数给上面的路由执行
@app.route('/')
def  a_page():    
return "Hello World"    
pass
  • 或者是另一种方法

debug模式

  • flask支持修改端口,访问的ip以及调试模式
if __name__=="__main__":    app.run(host="0.0.0.0",port=8888,debug=True)    
main()

静态资源加载

  • 新建static和templates文件夹
  • 设置静态文件的路径
app = Flask(__name__,            
static_url_path='/static',
# 当解析到这个地址的时候,不要通过路由的方法解析,而是访问static文件内容            
static_folder='static',            template_folder='templates'           
)

参数的传入

单个参数

#单参数传入
@app.route('/get/<user_input>')
def user_input(user_input):    
return user_input    
pass

多个参数

#多参数传入
@app.route('/login/<username>/<passwd>')
def multiy(username, passwd):    
return "Login User:%s"%username+' ' \
''+"Login Passwd:%s"%passwd   
pass

指定传入的参数的类型
乱传入会导致404

#多参数传入
@app.route('/login/<str: username>/<int: passwd>')
def multiy(username, passwd):    
return "Login User:%s"%username+' ' \
''+"Login Passwd:%s"%passwd   
pass

指定传参的方法
GET方法

from flask import request
@app.route('/login',methods=['GET'])
# 指定GET方法提交,否则返回405
def multiy():    
username = request.args.get("username")
#username为一个参数,此时args只能用于get方法
passwd = request.args.get("passwd")
#passwd为一个参数
return "Login User:%s and Login Password:%s"%(username,passwd)    
pass
# 访问http://10.0.131.180:8888/login?username=123&passwd=456

POST方法

from flask import request
@app.route('/login',methods=['POST'])
# 指定POST方法提交,否则返回405
def multiy():    
username = request.form.get("username")
#username为一个参数,此时form只能用于post方法
passwd = request.form.get("passwd")
#passwd为一个参数
return "Login User:%s and Login Password:%s"%(username,passwd)    
pass
# 访问http://10.0.131.180:8888/login传入两个参数


获取请求类型

  • request.headers 获取请求头
  • request.method 获取请求类型
  • request.headers.get("User-Agent")获取请求UA信息
  • request.path 获取请求的路径

.fullpath(完整路径)
.baseurl
.url
.user_agent.platform


新建特殊的路由

#不通过装饰器传入
def route1():    
return "Hello Python!"    
pass

if __name__=="__main__":    
app.add_url_rule('/hellopy', route1)    app.run(host="0.0.0.0",port=8888,debug=True)    

接口

  • json数据:{“name”:“xiaoming”,“age”:“21”}
  • 可以使用json包,也可以from flask import json
  • 字典转化为json
# 定义一个字典
@app.route('/jiekou')
def jiekou():   
json_dic = {        
"name":"xiaoli",        
"age":"89",        
"score":"100"   
}    
#字典转化为json    
result = json.dumps(json_dic)    
return result    
pass

重定向

@app.route('/b')
def b_page(user_id):    
return "你来了啊"
@app.route('/redirect')def redirect():    
# 跳转到站外    
return flask.redirect('http://www.cctv.com')    
# 跳转到站内    
return flask.redirect(flask.url_for('/b'))

404重定向

# 404重定向
@app.errorhandler(404)
def page_not_found(e):    
return "你出错了",404

url别名

  • 当我们访问的路由很长的时候,我们可以给路由取一个别名
@app.route('/a/b/c/d/e/f/g/h',endpoint='ab')
def ab_page():    
    return "你到了"

@app.route('/j')
def tiaozhuan():    
    return flask.redirect(flask.url_for('ab'))
    # 访问/j会返回到上面的路由

异常捕获

  • 把网站的状态码全部反馈为404,可以防止黑客进行扫描
@app.route('/a')
def a_page():    
    return "Hello World", 404    
    pass
# 此时访问路由a,会受到404状态码,但是页面能正常显示
  • 主动抛出404状态码
@app.route('/a')
def a_page():    
    flask.abort(404)
    return 'a'
# 主动抛出404异常
    pass

支持html返回

  • 使用python解析html的编码
# 返回html语句
@app.route('/about')
def about():    
    return Response('<h1>This is title</h1>'                    
    '<p>This is paragraph</p>')

模板入门

  • 在templates里面新建一个模板的html文件(tempa.html)
  • 添加路由
# 返回和html模板
@app.route('/mb')
def muban():    
    return flask.render_template("tempa.html")
  • 模板的继承
    子模板继承父模板
  • 在父模板中圈定可以添加东西的区域
<!DOCTYPE html>
<html lang="en">
<head>    
<meta charset="UTF-8">   
<title>A路由测试</title>
</head><body>
<h1>这是父模板</h1>
<!--规定子模版从这里可以开始加东西-->
{% block contentBlock %}
<h1>This is parent temp</h1>
{% endblock %}
<!--这里结束添加-->
</body>
</html>
  • 子模版继承父模板的内容,并且添加自己的东西
{% extends 'tempa.html' %}
<!--这里表示继承父模板-->
{% block contentBlock %}
<!--这里字模板开始添加东西-->
{{super()}}
<!--super表示继承父模板的所有东西-->
<h2>这是字模板</h2>
<h3>HAHAHAHA</h3>
{% endblock %}
<!--结束继承-->

模板传参

  • {{x}}存放变量

  • {%…%}控制代码块

  • {#…#}注释符

  • 后端代码

# 模板传参
@app.route('/test1/<username>')
def test1(username):    
    user_name = username    
    return flask.render_template('test1.html',uname=user_name)    
    pass
  • 前端代码
<body>
<h1>Welcome,{{uname}}</h1>
</body>

过滤器

  • 新建一个过滤器,(例如叫做dore过滤器)
# 过滤器
@app.template_filter('dore')
# 新建一个过滤器
def do_reverse(li):    
    temp = list(li)    
    temp.reverse()    
    return temp
    # 此过滤器会把传入的列表进行翻转
  • 在模板中加入对过滤器的引用
<body>
<h1>
Welcome,{{listname | dore}}
</h1>
</body>
  • 路由给模板传入参数
@app.route('/filter')
def filter():   
    li = ['U', 'Love', 'I']   
    return flask.render_template('test1.html',listname=li)
    # 此时访问filter后,值在输出之前会首先经过过滤器进行过滤

控制代码块

  • for循环遍历列表中的值
    {% for item in mlist %}
  • {{item}}

  • {% endfor %}
    • if判断语句
      {% if vip==0 %}

    你没有充值

    {% elif vip ==1 %}

    lv1的内容

    {% endif %}

    cookie交互

    • 设置cookie
    # k路由设置cookie
    @app.route('/k')
    def k_page():    
        response = flask.make_response('success')    
        response.set_cookie('user_id', '10', max_age=50)    
        response.set_cookie('vip', '0', max_age=50)    
        return response
    
    • 读取cookie
    # n路由读取cookie
    @app.route('/n')
    def n_page():    
        user_id = request.cookies.get('user_id')    
        vip = request.cookies.get('vip')   
        return flask.render_template('cookie.html', 
        user_id=user_id, vip=vip)    
        pass
    
    <body>
    {% if vip == '0' %}
    {{'你不是vip'}}
    {% elif vip == '1' %}
    {{'您好'}}
    {% endif %}
    </body>
    
    • 退出登录删除cookie
    # 删除cookie
    @app.route('/logout')
    def logout():    
        response = flask.make_response('退出登录成功')    
        response.delete_cookie('user_id')    
        response.delete_cookie('vip')    
        return response    
        pass
    

    session 交互

    • session 比cookie更安全,因为它是存储在服务器的,而且加密
    • 设置加密字符串
    from datetime import timedelta
    # 配置加密字符串
    app.config['SECRET_KEY'] = "key123"
    # 设置七天有效
    app.config["PERMANENT_SESSION_LIFELINE"] = 
    timedelta(days=7)
    
    • 赋予session
    @app.route('/sess')
    def session_test():    
        response = flask.make_response('success')    
        session['user_id'] = '20'    
        session['vip'] = '0'    
        return response
    
    • 读取session
    # 读取session
    @app.route('/rs')
    def read_session():    
        response = flask.make_response('success')    
        user_id = flask.session['user_id']    
        vip = flask.session['vip']    
        return 
        flask.render_template('session.html',user_id=user_id,vip=vip)
    
    • 删除session
    # 删除session
    @app.route('/seout')
    def session_out():    
        flask.session.pop("user_id")    
        flask.session.pop("vip")    
        # session['user_id']=False    
        # sesson.clear()    
        return "success"
    

    表单处理

    • 前端代码
    <form method="post" action="/chuli">    
    用户名:<input type="text" name="uname"/><br/>    
    密码:<input type="password" name="passwd"/><br/>    
    <input type="submit" name="submit" value="提交">
    </form>
    
    • 后端代码
    @app.route('/form')
    def form():    
        return render_template('form.html')    
        pass
    
    @app.route('/chuli', methods=['POST'])
    def chuli():    
        if request.method=='POST':        
            username = request.form.get("uname")        
            password = request.form.get("passwd")        
            print("用户名提交了"+username+"密码提交了"+password)    
        return  render_template('chuli.html')    
        pass
    

    数据库入门

    # 数据库入门
    # 打开数据库
    db = pymysql.connect(host="localhost", user="root", 
    password="root",db="haha")
    # 创建目标对象
    cursor = db.cursor()
    #sql语句
    sql = "select * from users"
    # 执行sql语句
    cursor.execute(sql)
    # 确认执行
    db.commit()
    list1 = []
    for i in range(5):    
        data = cursor.fetchone()    
        # 取出来的是元组,可以转换为列表    
        li = list(data)    
        list1.append(li)
    for item in list1:    
        print(item)
    
    • 数据库的改善操作
    # 拿出所有
    for item in cursor.fetchall():    
    print(item)
    

    • 其他数据库执行语句
    sql = """
    INSERT INTO users(username,password)values('test3', '999')
    """
    try:
        #执行sql
        cursor.execute(sql)
        #确认
        db.commit()
    except:
        #执行失败就回退
        db.rollback()
    

    补充

    • flask返回其他类型的数据
    @app.route("/")
    def otherback():
        filename = getpaper.done()
        # 定义返回类型是一张图片,通过MIME确认
        resp1 = Response(filename, mimetype="image/jpg")
        return resp1
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值