flask之基础介绍和使用等相关内容-140
1 Flask是一个基于Python开发并且依赖jinja2模板(django模板语言)和Werkzeug WSGI(django:wsgiref)服务的一个微型框架
2 对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器
3 微(micro) 可以用单文件,也可以搞成django很多目录(自由定制)
缓存,认证,forms,orm。。。都没有---》很多第三方集成进去,想用就用,不想用就不集成---》可以任意组合
4 安装 :pip3 install flask
# 1 flask的简单使用
# from flask import Flask
# # 实例化得到一个flask对象
# app=Flask(__name__)
#
#
# # flask的路由是基于装饰器
# @app.route('/')
# def index():
# # 没有请求对象,没有响应对应
# return 'hello world flask'
# if __name__ == '__main__':
# app.run(port=8000)
#2 新手四件套
# from flask import Flask,render_template,redirect,jsonify
# # 实例化得到一个flask对象
# app=Flask(__name__,template_folder='templates')
#
# # flask的路由是基于装饰器
# @app.route('/')
# def index():
# # 1返回字符串
# # return 'hello world flask'
# # 2返回模板
# # return render_template('index.html')
# # 3 返回重定向
# # return redirect('http://www.baidu.com')
# # 4 返回json格式
# # return jsonify({'name':'lqz','age':18})
#
#
# if __name__ == '__main__':
# app.run(port=8000)
# 请求对象
from flask import Request
from flask import Flask,render_template,redirect,jsonify,request
# 实例化得到一个flask对象
app=Flask(__name__,template_folder='templates')
# flask的路由是基于装饰器
# request对象是个全局对象,request.args--->不同请求取出来是不同请求携带的数据
# 通过不同协程/线程来区分是哪个request
2 登陆小案例
main.py
Copyfrom flask import Flask,render_template,request,redirect,session,url_for
app = Flask(__name__)
app.debug = True
app.secret_key = 'sdfsdfsdfsdf'
USERS = {
1:{'name':'张三','age':18,'gender':'男','text':"道路千万条"},
2:{'name':'李四','age':28,'gender':'男','text':"安全第一条"},
3:{'name':'王五','age':18,'gender':'女','text':"行车不规范"},
}
detail.html
Copy
index.html
Copy
login.html
Copy
3 配置文件
# flask的配置文件
from flask import Flask,request,render_template,session,redirect,url_for
app=Flask(__name__)
## 方式一,直接给app设置(仅仅支持以下两个)
# app.secret_key='asdfasdfasdf4545322wefaaeaesfsad'
# app.debug=True # 调试模式
# 方式二,给app的config设置,可以设置所有配置文件
# 所有配置文件都是这个属性
# print(app.config)
# app.config['DEBUG']=True
# 第三种方式通过py文件(跟django一样了,但是不好,不常用)
# app.config.from_pyfile("settings.py")
#
#通过环境变量配置
# import os
# os.environ['DEBUG']='ddd'
# app.config.from_envvar(os.environ['DEBUG'])
#app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS'])
# 环境变量的值为python文件名称名称,内部调用from_pyfile方法
# app.config.from_json("setting.json")
# JSON文件名称,必须是json格式,因为内部会执行json.loads
# app.config.from_mapping({'DEBUG': True})
# 通过类配置(用的多)
# app.config.from_object('settings.DevelopmentConfig')
app.config.from_object('settings.ProductionConfig')
print(app.config)
'''
{
'DEBUG': get_debug_flag(default=False), 是否开启Debug模式
'TESTING': False, 是否开启测试模式
'PROPAGATE_EXCEPTIONS': None,
'PRESERVE_CONTEXT_ON_EXCEPTION': None,
'SECRET_KEY': None,
'PERMANENT_SESSION_LIFETIME': timedelta(days=31),
'USE_X_SENDFILE': False,
'LOGGER_NAME': None,
'LOGGER_HANDLER_POLICY': 'always',
'SERVER_NAME': None,
'APPLICATION_ROOT': None,
'SESSION_COOKIE_NAME': 'session',
'SESSION_COOKIE_DOMAIN': None,
'SESSION_COOKIE_PATH': None,
'SESSION_COOKIE_HTTPONLY': True,
'SESSION_COOKIE_SECURE': False,
'SESSION_REFRESH_EACH_REQUEST': True,
'MAX_CONTENT_LENGTH': None,
'SEND_FILE_MAX_AGE_DEFAULT': timedelta(hours=12),
'TRAP_BAD_REQUEST_ERRORS': False,
'TRAP_HTTP_EXCEPTIONS': False,
'EXPLAIN_TEMPLATE_LOADING': False,
'PREFERRED_URL_SCHEME': 'http',
'JSON_AS_ASCII': True,
'JSON_SORT_KEYS': True,
'JSONIFY_PRETTYPRINT_REGULAR': True,
'JSONIFY_MIMETYPE': 'application/json',
'TEMPLATES_AUTO_RELOAD': None,
}
'''
settings.py
# DEBUG=True
class Config(object):
DEBUG = False
TESTING = False
DATABASE_URI = 'xxxx'
USER='root'
PASSWORD='123'
class ProductionConfig(Config):
DATABASE_URI = 'mysql://user@localhost/foo'
USER = 'luffy'
PASSWORD = 'luffy?'
class DevelopmentConfig(Config):
DEBUG = True
DATABASE_URI = '127.0.0.1'
USER = 'root'
PASSWORD = '123'
class TestingConfig(Config):
TESTING = True
4 路由系统
from flask import Flask,render_template,redirect,jsonify,request
app=Flask(__name__,template_folder='templates')
# @app.route('/detail/<int:nid>',methods=['GET'],endpoint='detail')
# 转换器
'''
DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}
'''
# 路由系统本质(重点)
# @app.route('/')----本质原理----》index=app.route('/')(index)
# app.route()--->decorator内存地址----》index=decorator(index)
# self.add_url_rule(rule, endpoint, f, **options)
# 不使用装饰器来注册路由
# @app.route()
# def index():
# return jsonify({'name':'lqz','age':18})
#
# def home():
# return 'home'
# 不用装饰器,自己注册路由
# app.add_url_rule('/',endpoint='index',view_func=index)
# # url('/index',view.test,name='xxx')
# app.add_url_rule('/home',endpoint='home',view_func=home)
#与django路由类似
#django与flask路由:flask路由基于装饰器,本质是基于:add_url_rule
#add_url_rule 源码中,endpoint如果为空,endpoint = _endpoint_from_view_func(view_func),最终取view_func.__name__(函数名)
# endpoint如果不传,默认用函数名作为反向解析的名字,但是一定要注意多装饰器的问题
#### CBV(源码分析)
from flask.views import View,MethodView
# 如果继承的是View,必须重写dispatch_request,自己去做分发
# class Index(View):# 一般不集成view
# # 重写dispatch_request
# def dispatch_request(self):
# return '所有请求都走我,我自己分发'
# 继承MethodView----》它等同于django中的View
# class Index(MethodView):
# def get(self):
# print(request.method)
# return 'index 的get请求就过来了'
# def post(self):
# return 'post请求'