Flask,是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务,在介绍Flask之前首先来聊下它和Django的联系以及区别,
django个大而全的web框架,它内置许多模块,flask是一个小而精的轻量级框架,Django功能大而全,Flask只包含基本的配置, Django的一站式解决的思路,能让开发者不用在开发之前就在选择应用的基础设施上花费大量时间。Django有模板,表单,路由,基本的数据库管理等等内建功能。
与之相反,Flask只是一个内核,默认依赖于2个外部库: Jinja2 模板引擎和 WSGI工具集--Werkzeug , flask的使用特点是基本所有的工具使用都依赖于导入的形式去扩展,flask只保留了web开发的核心功能。
socket:
from wsgiref.simple_server import make_server def mya(environ, start_response): print(environ) start_response('200 OK', [('Content-Type', 'text/html')]) if environ.get('PATH_INFO') == '/index': with open('index.html', 'rb') as f: data = f.read() elif environ.get('PATH_INFO') == '/login': with open('login.html', 'rb') as f: data = f.read() else: data = b'<h1>Hello, web!</h1>' return [data] if __name__ == '__main__': myserver = make_server('', 8011, mya) print('监听8011') myserver.serve_forever()
Werkzeug是一个WSGI工具包,他可以作为web框架地城库,Werkzeug不是一个web服务器,也不是一个web框架,而是一个工具包
他可以作为WSGI工具包,他也也可以作为一个web框架的底层库,因为封装好多web框架爱的东西,例如:Request,Response,
flask是基于werkzeug写的
from werkzeug.wrappers import Request, Response @Request.application def hello(request): return Response('Hello World!') if __name__ == '__main__': from werkzeug.serving import run_simple run_simple('localhost', 4000, hello)
第一个flask:
from flask import Flask
app = Flask(__name__)
# flask的路由是基于装饰器
# 装饰器执行过程如果没有括号:把装饰器下面的函数当做参数传入装饰器(函数)去执行,并返回结果,赋值
@app.route('/')
def index():
return 'hello'
if __name__ == '__main__':
app.run(port=8000)
# 这里run本质上就是run_simple
flask四剑客:
1.render_template:就是渲染页面
2.redirect:重定向
3.return ’’ 发送普通数据
4.jsonify:传送json数据
from flask import Flask, render_template, request, redirect,jsonify app = Flask(__name__) USERS = { 1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"}, 2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"}, 3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"}, } @app.route('/') def index(): # 返回所有用户的表格 # 返回模板,模板渲染的数据应该打散传过去 # 返回json数据 # name_dict = [{'name': "jason-gdx"}, {'name': "tank-sb"}] # return jsonify(name_dict) return render_template('index.html', user_dic=USERS) # methods = ['GET','POST'] 允许get和post请求 @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'GET': return render_template('login.html') # request.form 就是django中的POST user = request.form.get('user') pwd = request.form.get('pwd') print(user, pwd) if user == 'cnm' and pwd == '123': return redirect('/') # 重定向 else: return '用户名密码错误' @app.route('/detail/<int:nid>') # 有名分组 def detail(nid): user = USERS[nid] return render_template('detail.html', user=user) if __name__ == '__main__': app.run(port=8000)
配置文件:
from flask import Flask app = Flask(__name__) # 第一种方式: # app.debug = True # app.secret_key = 'sb' # 第二种方式:以字典的方式 # app.config['debug'] = True # 第三种,以文件的形式 # app.config.from_pyfile('settings.py') # 第四种:以类的形式(推荐),可以继承基类,随时进行切换 app.config.from_object('settings.TestingConfig') @app.route('/') def index(): print(123) return 'hello'
路由系统和反向解析
from flask import Flask, url_for,redirect app = Flask(__name__) # 本质: # 1.虽然flask路由基于装饰器,但它的本质是:add_url_rule # 2.我不用装饰器来配置了,直接用add_url_rule # 3.endpoint随便取,但是不能重复,一旦重复就会报错 # @app.route('/', methods=['GET'],endpoint='sb') def index(): return 'hello' # endpoint = 起别名 app.add_url_rule('/', view_func=index, endpoint='sb') # 反向解析:url_for('sb') @app.route('/login') def login(): print(url_for('sb')) return redirect(url_for('sb'))
flask视图函数(CBV)
from flask import Flask, views app = Flask(__name__) app.debug = True # class IndexView(views.View): # methods = ['POST', 'GET'] # 请求方式 # decorators = [] # # def dispatch_request(self): # print('index') # return 'Index' class IndexView(views.MethodView): methods = ['POST', 'GET'] # 请求方式 # 装饰器怎么加?,排在第一,最内层 # decorators = [装饰器1,装饰器2] def get(self): print('index') return 'Index:get' def post(self): return 'index:post' app.add_url_rule('/index', view_func=IndexView.as_view(name='index')) if __name__ == '__main__': app.run() """ -django中的缓存 -三种粒度 -全栈:两个中间件 -单视图缓存:用装饰器@cache_page(15) -局部缓存: {% load cache %} {% cache 2 'name'%} <h3>缓存:------:{{ t }}</h3> {% endcache %} """