Flask(3)

一、请求(request) 

1、HTTP协议

         Request Headers - 请求消息头
         Response Headers - 响应消息头

2、请求对象 - request

         request - 请求对象,封装了所有与请求相关的信息。如:请求数据,请求消息头,请求路径,... ...
         在 Flask 中,请求信息被封装到 request 对象中。要使用 request 的话,必须先导入:from flask import request

1、request的常用成员:

           1、scheme : 获取请求方案(协议)
           2、method : 获取本次请求的请求方式(get/post)——(重点)
           3、args   : 获取使用get请求方式提交的数据
           4、form   : 获取使用post请求方式提交的数据
           5、cookies: 获取 cookies 的相关信息
           6、headers: 获取 请求消息头 的相关信息
           7、files  : 获取用户上传的文件
           8、path   : 获取请求的url地址(进入到主机后的请求数据资源地址,不包含请求参数)
           9、full_path: 获取请求的url地址(完整路径),(进入到主机后的请求资源地址,包含请求参数)
           10、url   : 获取完整的请求地址,从协议开始的地址
           11、values: 获取GET和POST请求方式提交的数据(GET和POST通用)
           12、referer:获取Referer 请求消息头的信息

 1 from flask import Flask, render_template, url_for, request
 2 
 3 app = Flask(__name__)
 4 
 5 # 访问路径 http://localhost:5000/01-request
 6 @app.route('/01-request')
 7 def request_views():
 8     # print(dir(request))
 9     # 获取请求方案(协议)
10     scheme = request.scheme
11     # 获取请求方式
12     method = request.method
13     # 获取get请求方式的请求数据
14     args = request.args
15     # 获取post请求方式的请求数据
16     form = request.form
17     # 获取cookies中的信息
18     cookies = request.cookies
19     # 获取请求路径(具体资源,不带参数)
20     path = request.path
21     # 获取请求路径(具体资源,带参数)
22     full_path = request.full_path
23     # 获取请求路径(完整路径)
24     url = request.url
25     # 获取所有的请求消息头
26     headers = request.headers
27     print(headers)
28     # 获取 User-Agent 请求消息头信息
29     ua = request.headers['User-Agent']
30     # 获取 Referer 请求消息头的信息
31     referer = request.headers.get('Referer','')
32     return render_template('01-request.html',params= locals())
33 
34 
35 if __name__ == '__main__':
36     app.run(debug=True)
01-request.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>scheme:{{ params.scheme }}</h3>
    <h3>method:{{ params.method }}</h3>
    <h3>args : {{ params.args }}</h3>
    <h3>form : {{ params.form }}</h3>
    <h3>cookies : {{ params.cookies }}</h3>
    <h3>path : {{ params.path }}</h3>
    <h3>full_path : {{ params.full_path }}</h3>
    <h3>url : {{ params.url }}</h3>
    <h3>headers : {{ params.headers }}</h3>
    <h3>User-Agent : {{ params.ua }}</h3>
    <h3>Referer : {{ params.referer }}</h3>
</body>
</html>
01-request.html

2、获取请求提交的数据

     1、get 请求方式
             1、表单允许实现的get请求
                     <form action="" method="get">
                         姓名:<input name="uname">
                     </form>
             2、所有地址栏访问请求都是get请求的数据
             3、在请求地址后拼请求提交的参数
                     http://localhost:5000/02-get?uname=xxx&upwd=xxx
                     get请求的数据是放在 QueryString 中的
              获取 get 请求方式提交的数据
                     request.args 封装的就是 get 请求的数据,类型为字典。
                  ex:request.args['name'] : 获取 name 对应的值
                         request.args.get('name') : 同上
                         request.args.getlist('name_list') : 获取 name_list 列表数据

 1 from flask import Flask, render_template, url_for, request
 2 
 3 app = Flask(__name__)
 4 
 5 # 访问地址 http://localhost:5000/05-form-get
 6 @app.route('/02-form-get')
 7 def form_get():
 8     return render_template('05-form-get.html')
 9 
10 #访问地址 http://localhost:5000/06-get
11 @app.route('/03-get')
12 def get_views():
13     #print(request.args)
14 
15     uname = request.args['uname']
16     upwd = request.args['upwd']
17 
18     print('uname:%s,upwd:%s' % (uname,upwd))
19 
20     return "Get Success"
21 
22 
23 if __name__ == '__main__':
24     app.run(debug=True)
02-form-get.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>
    <a href="/02-get?uname=laowei&upwd=wangwc">去往02-get</a>
</h1>
<form action="/02-get" method="get">
    <p>
        姓名: <input type="text" name="uname">
    </p>
    <p>
        密码: <input type="password" name="upwd">
    </p>
    <p>
        <input type="submit" value="提交">
    </p>
</form>
</body>
</html>
02-form-get.html

     2、post 请求方式

                 1、post请求的数据只有在表单中才能够被触发
                     <form method="post">
                     post请求的数据是放在 form 中的
                 2、获取 post 请求提交的数据
                     request.form 封装的就是 post 请求的数据,类型为字典。
                         request.form['name'] : 获取 name 对应的值
                         request.form.get('name') : 获取 name 对应的值
                         request.form.getlist('name') : 获取 name 列表数据(如复选框,下拉列表)
                 3、在 /login 中,想提交数据给服务器要判断。

 1 from flask import Flask, render_template, url_for, request
 2 
 3 app = Flask(__name__)
 4 
 5 #访问地址 http://localhost:5000/03-form-post
 6 @app.route('/03-form-post',methods=['GET','POST'])
 7 def form_post():
 8     if request.method == 'GET':
 9         return render_template('03-post.html')
10     else:
11         uname = request.form['uname']
12         upwd = request.form['upwd']
13         uemail = request.form['uemail']
14         tname = request.form['tname']
15         print("用户名:%s,密码:%s,邮箱:%s,真实姓名:%s" % (uname, upwd, uemail, tname))
16         return "Post OK"
17 
18 
19 if __name__ == '__main__':
20     app.run(debug=True)
03-form-post.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/03-form-post" method="post">
    <p>
        用户名称:<input type="text" name="uname">
    </p>
    <p>
        用户密码:<input type="password" name="upwd">
    </p>
    <p>
        用户邮箱:<input type="email" name="uemail">
    </p>
    <p>
        真实姓名:<input type="text" name="tname">
    </p>
    <p>
        <input type="submit">
    </p>
</form>
</body>
</html>
03-form-post.html

3、自定义错误页面

     1、404 的错误处理
         @app.errorhandler(404)
         def page_not_found(e):
             return render_template('404.html'),404
     2、500的错误处理
         @app.errorhandler(500)
         def internal_server_error(e):
             return render_template('500.html'),500
             ... ...
     404.html,500.html 需要自定义

二、响应(response)

1、什么是响应

     响应就是由服务器端带给客户端的内容,对应着请求。
     响应可以是普通的字符串,模板 或 重定向
 ex: @app.route('/')
          def index():
         return "普通字符串"
         return render_template('xxx.html')
         # 以上两种行为,本质上响应回去的都是字符串

2、响应对象

     响应对象:将响应的内容封装到一个对象中,可以完成更多的响应的行为(如:增加cookies,...)
     1、构建响应对象,再响应给客户端
         注意:不是直接响应字符串,而是响应对象。响应对象可以包含响应的字符串,同时也可以实现其他的响应操作
     2、在 flask 中,使用 make_response() 构建响应对象
         from flask import make_response
         @app.route('/xxx')
         def xxx():
             resp = make_response('响应内容')
             # 允许实现其他的响应行为,如:添加cookies,...
         return resp

 1 import os
 2 import datetime
 3 from flask import Flask, render_template, request, make_response, redirect
 4 
 5 app = Flask(__name__)
 6 
 7 @app.route('/04-js')
 8 def js_views():
 9     return render_template('04-js.html')
10 
11 @app.route('/05-get')
12 def get_views():
13     name = request.args['name']
14     age = request.args['age']
15     return "姓名:%s,年龄:%s" % (name,age)
16 
17 
18 if __name__ == '__main__':
19     app.run(debug=True)
04-js.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <button onclick="btnClick()">跳转</button>
    <script>
        function btnClick(){
            window.location.href='/05-get?name=wangwc&age=35'
        }
    </script>
</body>
</html>
04-js.html

3、重定向

     1、什么是重定向
         由服务器端通知客户端重新向一个新的地址发送请求

     2、语法
         from flask import redirect
         ... ...
         return redirect('重定向地址')
         =================================
         resp = redirect('重定向地址')
         # 借助resp实现其他的响应行为
         return resp

 1 import os
 2 import datetime
 3 from flask import Flask, render_template, request, make_response, redirect
 4 
 5 app = Flask(__name__)
 6 
 7 @app.route('/06-response')
 8 def response_views():
 9     # resp = make_response('这是使用响应对象创建出来的响应内容')
10     resp = make_response(render_template('04-js.html'))
11     return resp
12 
13 @app.route('/07-redirect')
14 def redirect_views():
15     #直接通过重定向的方式,将请求发送给03-response
16     return redirect('/06-response')
17 
18 if __name__ == '__main__':
19     app.run(debug=True)
06-response.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <button onclick="btnClick()">跳转</button>
    <script>
        function btnClick(){
            window.location.href='/05-get?name=wangwc&age=35'
        }
    </script>
</body>
</html>
04-js.html

三、文件上传

1、注意问题

     表单中如果有文件上传的话,必须遵循以下两个要求
         1、提交方式 method 必须为 post
         2、表单的 enctype 属性必须设置为 multipart/form-data

2、服务器端

     1.通过 request.files 获取上传的文件
         f = request.files['文件框的name属性值']
     2.通过 f.save(保存路径) 将文件保存至指定目录处
         通过 f.filename 获取文件的名称
         filename = f.filename
         f.save('static/'+f.filename)
     示例:
         将上传的文件名称更改为 当前的时间(年月日时分秒微秒).扩展名 再保存到服务器上

 1 import os
 2 import datetime
 3 from flask import Flask, render_template, request, make_response, redirect
 4 
 5 app = Flask(__name__)
 6 
 7 @app.route('/07-file',methods=['GET','POST'])
 8 def file_views():
 9     if request.method == 'GET':
10         return render_template('07-file.html')
11     else:
12         # 获取上传的文件
13         f = request.files['uimg']
14         # 将上传的文件保存至指定的目录处
15         # 获取上传的文件的文件名
16         # 将文件名修改为当前时间作为名称,再上传
17         ftime=datetime.datetime.now().strftime('%Y%m%d%H%M%S%f')
18         # 获取文件的扩展名
19         ext=f.filename.split('.')[1]
20         filename = ftime + '.' + ext
21 
22 
23         # 将上传的文件保存至指定目录处[绝对路径]
24         basedir = os.path.dirname(__file__)
25         upload_path=os.path.join(basedir,'static/upload',filename)
26         print('upload_path:'+upload_path)
27         f.save(upload_path)
28 
29         return "Upload OK"
30 
31 if __name__ == '__main__':
32     app.run(debug=True)
07-file.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/07-file" method="post" enctype="multipart/form-data">
    <p>
        用户名称: <input type="text" name="uname">
    </p>
    <p>
        用户头像: <input type="file" name="uimg">
    </p>
    <p>
        <input type="submit">
    </p>
</form>
</body>
</html>
07-file.html

 

posted on 2018-11-07 21:20  破天荒的谎言、谈敷衍  阅读(264)  评论(0)    收藏  举报

导航