flask基础

flask python实现的web开发微框架,小而美,丰富的周边扩展,免费开源。

https://github.com/pallets/flask 官方源码

安装:

pip install flask

(pip install flask --timeout=99999)

换源 pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple/

验证:

>>> python

>>> import flask
>>> flask.__version__
'2.0.2'

配置调试模式:

app = Flask(__name__)

app.debug = True

if __name__==‘__main__’:

app.run(debug=True))

MTV:模板template

@app.route('/')
@app.route('/index.html')
def index():
    user = {
        'name':'张三'
    }
    return render_template('index.html',user = user)

if __name__=="__main__":
    app.run()

2.其他方式:flask的启动

第一步:设置环境变量,自动启动

windows:set FLASK_APP =flask.py

*linux: export FLASK_APP =flask.py(app.py)

第二步:flask run 启动内置web服务器,指定IP及端口

flask run --host =0.0.0.0 --port -8001

或 flask run -h 0.0.0.0 -p 8001

3.其他方式:开启调试模式

windows:set FLASK_ENV =development

*linux: export FLASK_ENV =development

在重新返回上面的第二步,重新启动run

  • 启动,app.run() 老方法

www.pypi.org

  • WTF-表单,最后一个restful是接口相关的,获取数据接口
  • 可以去https://pypi.org上搜索到更多的扩展资源,自己去找

常见的RUL协议:http,https,ftp

常见的http请求方式:POST,GET

GET,可以用于浏览器直接访问,请求可以携带参数,但是有长度限制,请求参数直接放在URL后面

POST,不能使用浏览器直接访问,对请求参数的长度没有限制,可以用来上传文件等需求

HTTP常见的状态码:

2xx 请求成功;3xx  重定向;4xx 请求错误;5xx  服务器错误。 详细的百度-HTTP状态码。

  • 给到URL找到view的过程,就是路由的过程
  • python的IDE就是pycharm

路由配置的两种方式:1,使用装饰器;2.使用API配置

# 路由配置使用装饰器 @app.route(url,methods)
@app.route('/test')
def hellotest():
    # 视图函数
    return 'hello world,test0222,测试函数'
# 使用API配置 app.add_url_rule(url,url_name,view_name)
app.add_url_rule('/test-apimethod','apimethod',hellotest)

路由匹配规则:

匹配整个文字:@app.route('/hello')

传递参数:@app.route('/user/<参数>')

指定参数类型:@app.route('/post/<int:参数>')

查看URL路由规则:app.url_map

URL逆向解析(根据名称解析成URL字符串):

1.url_for(url_name,**kwargs)

2,静态文件(js,CSS,图片等)引用  url_for('static',filename='style.css')

视图函数中获取页面传值:

url中的值,可以设置默认值,也可以不设置,或者为None

  • 如果page不传值会报错,路由上处理,并且添加一个默认值就好
@app.route('/user/<page>')
def list_user(page=1):

路由分发: 

上下文对象:应用上下文,请求上下文

在分派请求前,激活应用上下文和请求上下文,在请求处理完后,将其删除

应用上下文对象:current_app;g

current_app当前应用的实例 对象

g 处理请求时的临时存储对象,每次请求都会重设这个变量

请求上下文对象:request;session

request:请求对象,封装了客户端发出的http请求中的内容

session:用户会话(dict),各请求之间的数据共享

请求报文常用参数:

method:请求类型(GET,POST,OPTIONS等)

form:表示的是post请求过来的数据字典

args:表示的是get请求过来的数据字典

values:表示的是post和get请求过来的数据字典集合

files:上传的文件数据dict

cookies:请求中的cookie  dict

headers:HTTP请求头

html方如何参数传递到服务器:http://192.168.1.6:8001/test/req?page=2&name=mark

  • ?page=2&name=mark 参数传递 英文输入下

@app.route('/test/req')
def test_request():
    '''请求报文练习'''
    get_args = request.args
    print('get_args',get_args)# get请求参数获取
    print(get_args.get('page',1)) # 请求中没有传入page值,那么可以设置默认值
    print(request.args.get('name'))
    # 获取服务器所在的主机IP地址
    headers = request.headers
    print(headers)
    print('host',headers.get('host'))

    # 获取请求用户的ip地址
    user_ip = request.remote_addr
    print('user_ip',user_ip)
    print(request.remote_user)

    # 获取user-agent,可以用于爬虫
    user_agent = request.headers.get('user-agent',None)
    print('User-Agent:','\n',user_agent)
    return 'request success'

 请求钩子:

  • 请求钩子函数的使用
  • 常见的应用场景:before_first_request 链接数据库,只需要链接一次,后续调用即可
  • before_request 使用场景举例;IP地址的拦截,每次请求之前都要拦截
@app.before_first_request
def first_request():
    """服务器启动后第一个请求到达前"""
    print('服务器启动后第一个请求到达前,first_request')

@app.before_request
def per_request():
    """每一个请求到达前"""
    print('每一个请求到达前,per_request')

 

 也可以通过构造对象正常修改

@app.route('/test/resp')
def test_response():
    """测试响应"""
    return '响应测试,reponse success',405,{
        'user_name':'mark','user_id':'mark_id2'}


@app.route('/test/mkresp')
def test_mkresponse():
    '''使用make_response构造响应对象'''
    mkresp = make_response('这是一个响应对象',403,{
        'token':'abc123'
    })
    mkresp.headers['user_name'] = 'nick_li'
    mkresp.status_code = 200
    return mkresp

@app.route('/test/htmlresp')
def test_html_response():
    '''响应html'''
    html = '<html><body><h1 style="color:red">这是一个HTML响应测试</h1></body></html>'
    resp = make_response(html)
    return resp

@app.route('/test/html')
def test_html():
    '''从文件读取html'''
    html = render_template('test1.html')
    resp = make_response(html,400) # 都可以参考前面的使用
    return resp

redirect() 重定向

abort() 处理错误

@app.route('/')
def helloworld():
    # 视图函数
    # return 'hello world,susede'
    # 访问'/'时,重定向到'/test'页面
    # return redirect('/test')
    # abort(403) # 触发一个异常,不需要return,会调用后续的forbidden函数
    # ip 拦截
    ip_list = ['127.0.0.2']
    ip = request.remote_addr
    if ip in ip_list:
        abort(403)  #  会调用后续的forbidden函数
    return 'hello,sucess,welcome'
@app.errorhandler(403)
def forbidden_page(err):
    """403错误提示:你没有权限访问页面"""
    print(err)
    return '你没有权限访问页面,请联系管理员开通权限'

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值