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'
主动抛出异常程序会自动寻找处理此状态码的函数
本文来自博客园,作者:icui4cu,转载请注明原文链接:https://www.cnblogs.com/icui4cu/p/16156113.html