Flask总结

1.web框架
web后端:
Web框架:
vue,jquery,bootstrap

flask:
django:
tornado:

flask:
方向:
1. mtv 带模板html 模版语言
2. 前后端分离  只负责写接口 api
   REST: get  post  put  patch  delete
    
搭建框架:
1.要有虚拟环境:
 linux: virtualenv  virtualenvwrapper
        配置文件的修改:  .Envs
        .bashrc
        ...


 windows:pip install virtualenvwrapper-win
         mkvirutalenv mytest1  新建虚拟环境
         workon 虚拟环境名
         deactivate  退出虚拟环境
         rmvirutalenv 虚拟环境名

2. 新建虚拟环境:
   将项目切换到虚拟环境上

   点击终端:(flaskenv) C:\Users\running\Desktop\GPDay41\代码\day41_flask>
   说明进入到虚拟环境中....
2.Flask框架
from flask import Flask
import settings

app = Flask(__name__)
# 根据配置文件设置
app.config.from_object(settings)
# 装饰器  路由  URL  http://127.0.0.1:5000/
@app.route('/')
def index():   # 视图函数   mtv: view 视图   函数
    return '大家好!哈哈哈哈哈'
def deal():
    return ''

# WSGI: Python Web Server Gateway Interface  是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口
# flask 内置服务器 
if __name__ == '__main__':
    # host 设置为'0.0.0.0'  可以让外界访问   debug=True----当代吗改变时自动加载,默认关闭
    app.run(host='0.0.0.0', port=5000, debug=True)  # 设置端口号最好在启动之前设置
3.flask环境搭建
from flask import Flask
import settings

app = Flask(__name__)
app.config.from_object(settings)
# 多个路由
@app.route('/')
def hello_world1():
    return 'Hello World111111!'

@app.route('/index')
def hello_world2():
    return 'Hello World222222!'

@app.route('/test')
def hello_world3():
    return '<font color="red"> Hello World333333! </font>'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)
    
3
app=  Flask(__name__)
1.关联服务器并启动
  app.run(host='',port=5000)

  在终端: python app.py
2. app.route('/')  注册路由
   def func():
      return .....
4.配置
# 配置文件
ENV = 'development'
DEBUG = True

配置:
Environment: production
 production   ----》 正在
 development  ---》开发
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off

debug mode:on

run(deubg=True)  ----> mode:on
on的模式: 代码有改变则服务器重启(重新加载程序)
5.导入配置文件
在app启动前引入文件(两种)1. app.config.from_object(settings)
    2. app.config.from_pyfile('settings.py')

flask是基于Werkzeug工具包的一个web服务框架,所以flask里视图函数的实现,实际上是对werkzeug的一层封装

路由结合视图函数
    @app.route('/')
    def hello_world():  # ---->视图函数
        return 'HELLO hello world!hello kitty!'

#endpoint 相当于起了个别名
@app.route('/abc',endpoint='abc1')
def show_abc():
    return '<h1>abc</h1>'
# route就是将函数与add_url_rule进行了装饰
def show_name():
    return '千锋教育'
app.add_url_rule('/name', view_func=show_name)
路径(路由)的变量规则:
   转换器:
         str 默认
         int  整型
         float 浮点型
         path  类似str,但是可以识别'/'
         uuid  识别uuid类型的字符串

   @app.route('/news/<int:num>')   ----><int:num>表示的就是一个变量

# url_for:反向解析
@app.route('rule',endpoint='value')
def func():
    pass

url_for('endpoint')  -----------> 根据endpoint找到路由rule
6.请求和响应
请求request,响应response

请求:request
from flask import request
  client 发出的请求

  request对象   只要有请求则会产生一个request对象

  request.method  获取请求的方式
  request.args.get('key',默认值)    ----> get
  request.form.get('key',默认值)    ----> post
  request.values ----> [dictA,dictB]  dictA---GET   dictB--POST
  request.get_json()  application/json 类型数据
  request.get_data()  将数据构成一个字节字符串

  request.remote_addr  获取远程的ip地址
    print(request.path)  # /
    print(request.full_path)  # /?name=admin
    print(request.url)  # http://127.0.0.1:5000/?name=admin
    print(request.base_url)  # http://127.0.0.1:5000/
    print(request.url_root)
    print(request.method)  # 'GET'
    print(request.query_string)  # b'name=admin'

响应:response

   在视图函数的返回值后面可以跟:
   1.string   系统会自动将str转成一个response对象
   2.make_reponse( ) 构建response对象,可以给response对象添加一些头部信息
   3.jsonify(datas)  将datas转成json的格式  dict默认使用此函数
   4.render_template()
   5.redirect()
    
注:make_response()
注意:make_response 想要返回页面,不能直接写做:make_response('hello.html'),必须用render_template('hello.html')形式。
例一:
@blue.route('/makeresponse/')
def make_response_function():
    response = make_response('<h2>羞羞哒</h2>')
    return response, 404
例二:
@blue.route('/makeresponse/')
def make_response_function():
    temp = render_template('hello.html')
    response = make_response(temp)
    return response
返回状态码的方式: 1》 response = make_response(temp, 200)
				2return response, 200
8.web中状态码

1.web中的请求状态码:

201创建或更新数据成功

204删除数据成功

301永久重定向,多次发请求时,直接进入定向后的网址,相当于一次请求
302临时重定向,一次请求时,请求完后,进入定向的网址,相当于两次请求

303表示对post请求进行重定向

307表示对get请求进行重定向
400 前端请求错误

401 用户未进行登录认证

403 无访问权限
404请求未找到
405 请求方式不允许

406 服务器无法返回请求制定的accept字段格式。

503 服务异常,可能是服务器负载过重

507 服务器存储错误

  1. 请求方式post,get,head,options,put,delete区别
    get请求方式一般用于查询数据。
    post请求一般用于表单或json数据更改,安全性更高。可以在请求体中增加一些数据。

put 一般用于更新数据

delete请求用于删除数据

options 查询信息,查询服务端的支持的请求方式。

9.路由
# @router() 与 add_url_rule(rule, endpoint, f, **options)
from flask import Flask
route:
    def route(self, rule, **options):
        def decorator(f):
            self.add_url_rule(rule, endpoint, f, **options)
            return f
        return decorator

@app.route('/index')
def index():
    return 'welcome everyone!'
# 这个装饰器其实就是将rule字符串跟视图函数进行了绑定,通过add_url_rule()实现的绑定   
# 等效的
def index():
    return 'welcome everyone!'
app.add_url_rule('/index', view_func=index)
2.路由的变量规则:

string  (缺省值) 接受任何不包含斜杠的文本   *
int      接受正整数  *
float    接受正浮点数
path     类似 string ,但可以包含斜杠
uuid     接受 UUID 字符串
# 字符串类型不可自定,是默认的,而其他类型必须自定

@app.route('/add/<int:num>')
def add(num):
    print('--->', type(num))
    result = num + 10
    return str(result)
@app.route('/add1/<float:money>')
def add1(money):
    print('====>', type(money))
    return str(money)
@app.route('/index/<path:p>')
def get_path(p):
    print('******>', type(p))  # str类型
    print(p)
    return p
@app.route('/test/<uuid:uid>')  # 必须传递uuid的格式,uuid模块, uuid.uuid4() ---->UUID类型
def test(uid):
    print('#######>>>>>', type(uid))
    return '获取唯一的标识码'
注意:uuid类型----------
import uuid

uid = uuid.uuid4()
print(uid)
print(type(uid))

uid1 = str(uid)
print(type(uid1))
uid1 = uid1.replace('-','')
print(uid1)
10.有参数的路由
@app.route('/getcity/<key>')  # key就是一个变量名,默认是字符串类型的
def get_city(key):  # 参数是必须添加的
    print(type(key))
    return data.get(key)
11.视图函数
#类型一:
@app.route('/index')
def index():
    return {
   'a': '<h1>北京</h1>', 'b': '上海', 'c': '深圳'}  # application/json,标签内容原样显示
#类型二:
@app.route('/index1')
def index1():
    return '<h1>北京</h1>' 
#类型三:
@app.route('/index2')
def index2():
    # ValueError: not enough values to unpack (expected 2, got 1)
    # return ('beijing', 'shanghai', 'shenzhen')
    return ('beijing',200)

#类型四:
@app.route('/index3')
def index3():
    return Response('<h1>大家想好中午吃什么了吗?</h1>')  # 返回的Response对象

# 返回值:  # Content-Type:text/html; charset=utf-8
# return 后面返回的字符串其实也是做了一个response对象的封装。最终的返回结果还是response对象
# return 的返回值可以是:string dict pulple response对象 WSGI
# 必须要有返回值,不能为None
返回值总结:
1.str
2.dict
3.Response
4.render_template()
5.redirect()
6.make_response()
12.路由路径
# 所有的路由搜索规则都是自上而下搜索,在写路由的是有定义的路由是唯一的。
# 路由中定义'/',无论请求的URL是否带有/,都可以执行视图函数。如果请求的是有/,浏览器做了一次重定向
@app.route('/projects/')   
def projects():
    return 'The project page'
@app.route('/projects')  # 请求路由中如果添加了/     http://127.0.0.1:5000/projects/  显示Not Found
def about():
    return 'The about page'
# 不建议带/,我们希望请求路径是惟一的,
# 以上面这种方式写,第二个将永远不会执行
13.渲染模板
# render_template 渲染模板,就是将h5文件转换为字符串,<class 'str'>
@app.route('/register')
def register():
    r = render_template('register.html')  # 默认去模板文件夹中找文件夹的,怎么就知道文件夹就是templates?
    # print(r)
    return r
# 注意:一个pycharm的bug,h5文件写了,但显示不出来,报错,需要重启或重新创建h5文件
14.get 与 post
@app.route('/register2', methods=['GET', 'POST'])
def register2():  # 获取页面提交的内容
    print(request.full_path)  # /register2?username=zhangsan&address=Beijing
    print(request.path)  # /register2
    print(request.args)  # dict类型  d = {'a':'aaa','b':'7878'}  d.get('b')  只能取到get请求的
    # print(request.args.get('username'))   # 获取值
    # print(request.args.get('address'))
    print(request.form)  # 如果请求方法是post则需要通过request.form取值
    print(request.form.get('username'))
    print(request.form.get('address'))
    return '进来了'
15.重定向
redirect() 
返回值为response对象,Supported codes are 301, 302, 303, 305, 307, and 308300 is not supported 
作用:redirects the client to the target location
参数:(location, code=302, Response=None)
工作过程:1.向浏览器返回 状态码和location
		2.浏览器接收到状态码后,重定向后请求location地址,服务器响应请求地址
		
url_for('地址别名')
作用:反向解析(通过别名解析地址),返回一个地址
可以写为:
		return  redirect(url_for('地址别名')) 
16.模板-1
render_template(template_name_or_list, **context)  渲染模板

模板:(网页)
模板的语法:
1. 在模板中获取view中传递的变量值:{
   {
    变量名key }}
2. 向模板传递参数: render_template('模板名字',key=value,key=value)

@app.route('/show')
def show():
    name = '沈凯'  # str
    age = 18  # int
    friends = ['建义', '陈璟', '小岳岳', '郭麒麟']  # list
    dict1 = {
   'gift': '大手镯', 'gift1': '鲜花'
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值