12.web开发之flask-1

前置设置

在settings中的Manage Repositories修改python源为douban:https://pypi.douban.com/simple/ ,并下载flask包

flask基本设置

flask:python轻量级web框架,自己本身就是一个中间件,借助操作系统安装的python程序运行

路由: 什么路径可以访问到什么资源,在flask中以装饰器的方式存在

import flask
from flask import 

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

# 通过设置不同的路由访问不同的页面
@app.route('/abc')
def a_page():
    return "this is a page"

# 装饰器,关联路由
@app.route('/')
def index():
    return "haha"

if __name__ == '__main__':
    # 运行flask程序,默认5000端口
		# 可以修改为8888端口,开启debug模式,并用本机的IP访问
    app.run(host='0.0.0.0', port=8888, debug=True)

flask的请求和参数

新建两个文件夹为static和templates

import flask
from flask import *

# 创建Flask程序
app = Flask(__name__,
            static_url_path='/static',  # 静态文件路径,当程序解析到static目录时,不用路由的方式解析,而是读取文件的方式
            static_folder='static',
            template_folder='templates'  # 模板文件,HTML代码就放里面
            )

# 通过/进行参数传入,可以在参数前添加限定变量类型,传入参数不符合标准直接404
@app.route('/abc/<user_id>/<int:user_pass>')
# ()内的参数和传入参数名字一致
def a_page(user_id, user_pass):
    return "this is a page %s-----%s hahahahah" % (user_id, user_pass)

# PHP中传参通过?=,而在这里是通过/进行传参,如这里就是/abc/xiaoming/123

# 装饰器,关联路由
@app.route('/')
def index():
    return "haha"

if __name__ == '__main__':
    # 运行flask程序,默认5000端口,可以修改为8888端口并可以用本机的IP访问
    app.run(port=8888, debug=True)

如果不想通过/进行传参,可以像PHP一样使用?

GET型

@app.route('/abc',methods=['GET'])
# ()内的参数和传入参数名字一致
def a_page():
    username = request.args.get('uname')
    userpass = request.args.get('upass')

    return "this is a page %s----%s hahahahah" % (username,userpass)

POST型

@app.route('/abc', methods=['POST'])
# ()内的参数和传入参数名字一致
def a_page():
    username = request.form.get('uname')
    userpass = request.form.get('upass')

    return "this is a page %s----%s hahahahah" % (username, userpass)

如果将传参方式修改为POST,依然使用GET方式提交,出错是405”Method Not Allowed”

flask参数类型

request.method 获取请求类型

@app.route('/abc',methods=['GET','POST'])
def a_page():
    # 获取请求的类型
    return "this is a page %s hahahahah" % (request.method)

request.headers 获取请求头

@app.route('/abc',methods=['GET','POST'])
def a_page():
    return "this is a page %s hahahahah" % (request.headers)
	  # 获得header头指定参数
		return "this is a page %s hahahahah" % (request.headers.get('User-Agent'))
		# 获取请求访问路径(只能获得路由)
		return "this is a page %s hahahahah" % (request.path)
		# /abc
		

request 其他参数和结果

full_path:获得全部请求路径(包括后面GET请求带的参数)
# /abc?uname=haha&upass=123

base_url:只显示请求的网站完整url
# http://127.0.0.1:8888/abc

url:显示完整url和参数
# http://127.0.0.1:8888/abc?uname=haha&upass=123

user_agent:显示User-Agent
# Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0

user_agent.platform:显示User-Agent的操作系统信息
# Windows

user_agent.browser:显示User-Agent的浏览器信息
# firefox
user_agent.version:显示浏览器版本号
# 52.0

json和字典

通过python给别人一个接口,接口一般返回json格式数据

{"name":"xiaoming","age":"21"}

字典转换为json字符串

@app.route('/abc',methods=['GET','POST'])
def a_page():
    # 定义一个字典
    json_dict = {
        "name":"xiaoli",
        "age":"89",
        "score":"100"
    }
    # 字典转换成json字符串
    result = json.dumps(json_dict)
    return result

# {"age": "89", "name": "xiaoli", "score": "100"}

json字符串转化成字典

dict1 = json.loads('{"age": "89", "name": "xiaoli", "score": "100"}')
print(dict1["name"])
return 'x'

# 此时访问网站,网站返回x,python控制台返回xiaoli,证明已经转化成字典格式

重定向

站外重定向和站内重定向

@app.route('/redirect')
def a_page():
    # 站外重定向
    return flask.redirect('http://www.cctv.com')
    # 站内重定向,通过函数名找路由
    return flask.redirect(flask.url_for('b_page'))

@app.route('/b')
def b_page():
    return 'you are here!'

404重定向

# 404重定向
@app.errorhandler(404)
def page_not_found(error):
    return "you are wrong! 404 not found!", 404

@app.route('/a')
def a_page():
    return 'haha'

@app.route('/b')
def b_page():
    return 'you are here!'

访问a和b正常跳出页面,一旦路由不存在自动跳转到404重定向函数

url别名和异常处理

url别名

@app.route('/a')
def a_page():
    # 直接访问别名即可,不需要访问函数
    return flask.redirect(flask.url_for('b1'))

@app.route('/woshihenchangdeluyou', endpoint='b1')
def b_page():
    return 'you are here!'

异常处理

返回具有迷惑性的状态码

如果在return后直接添加404,会返回404状态码,但不影响内容输出

@app.route('/a')
def a_page():
    return 'a',404

在扫描器中反馈的就是404

主动抛出异常

# 404重定向
@app.errorhandler(404)
def page_not_found(error):
    return "you are wrong! 404 not found!", 404

@app.route('/a')
def a_page():
    flask.abort(404)
    return 'a'

主动抛出异常程序会自动寻找处理此状态码的函数

posted @ 2022-04-17 16:12  icui4cu  阅读(35)  评论(0编辑  收藏  举报