------------恢复内容开始------------
1.flask的简介以及flask启动的本质
2.flask的4剑客
3.flask配置文件的4种方式
4.路由本质
5.cbv初识,路由的本质,cbv详解
一.flask的简介以及flask启动的本质
什么是flask:
Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或,
Web服务,在介绍Flask之前首先来聊下它和Django的联系以及区别,django个大而全的web框架,
它内置许多模块,flask是一个小而精的轻量级框架,Django功能大而全,Flask只包含基本的配置,
Django的一站式解决的思路,能让开发者不用在开发之前就在选择应用的基础设施上花费大量时间。
Django有模板,表单,路由,基本的数据库管理等等内建功能。与之相反,Flask只是一个内核,
默认依赖于2个外部库: Jinja2 模板引擎和 WSGI工具集--Werkzeug,flask的使用特点是基本所有的
工具使用都依赖于导入的形式去扩展,flask只保留了web开发的核心功能
简单来说:
1. 是web框架,他和django一样都是web框架
2.和django一样都是同步的框架
3.用的是 jinjia2模板
4.通过 werkzeug 来起的服务
wsgi的一个请求
1 from wsgiref.simple_server import make_server 2 3 ''' 4 environ:请求相关的 5 start_response:响应相关的 6 ''' 7 def mya(environ, start_response): 8 print(environ) 9 start_response('200 OK', [('Content-Type', 'text/html')]) 10 if environ.get('PATH_INFO') == '/index': 11 with open('index.html','rb') as f: 12 data=f.read() 13 14 elif environ.get('PATH_INFO') == '/login': 15 with open('login.html', 'rb') as f: 16 data = f.read() 17 else: 18 data=b'<h1>Hello, web!</h1>' 19 return [data] 20 21 if __name__ == '__main__': 22 # 端口 传入可执行对象 23 myserver = make_server('', 8011, mya) 24 print('监听8011') 25 myserver.serve_forever()
Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库,
因为他封装了很多Web框架的东西,例如Request,Response等等。
1 from werkzeug.wrappers import Request, Response 2 @Request.application 3 def hello(request): 4 return Response('Hello World!') 5 6 if __name__ == '__main__': 7 from werkzeug.serving import run_simple 8 ''' 9 记住,只要用户请求过来的,就调用run_simple 10 基于wsgi,都有这三个参数 ip,端口,可执行对象 11 ''' 12 run_simple('localhost', 4000, hello)
如何起一个flask项目
# 如何启动一个flask项目 from flask import Flask app = Flask(__name__) # 控制器 # mvc,c mfv,v # 路由用一个装饰器 @app.route('/') def index(): return "ok" # 把这个类启动起来 if __name__ == '__main__': # 本质就是run_simple(host,port,app,**options) #app(),对象加(),执行__call__ app.run()
二.flask的4剑客
from flask import Flask,render_template,redirect,jsonify app = Flask(__name__) # 路由匹配,用装饰器的形式 @app.route('/') def index(): # 1.直接返回字符串 return 'ok' # 2.返回html name_dict = {'name':'jason_gdx'} return render_template('index.html',name='fzy',name_dict=name_dict) # 3.还可以跳转页面 return redirect('/login') # 返回json数据 name_dict = [{'name': 'jason_gdx'}] return jsonify(name_dict) @app.route('/login') def login(): return 'ojbk_login' if __name__ == '__main__': app.run()
三.flask配置文件的4种方式,其他的配置方式,有哪些配置项简介
.py文件
from flask import Flask app = Flask(__name__) # 配置文件1,但是这种方式只能配置2种 # 把debug给为True,只要你修改了代码,按ctrl+s就可以刷新 app.debug = True app.secret_key = '123123' # 第二种,以字典对的形式 app.config['DEBUG'] = True # 第三种,以文件的形式 app.config.from_pyfile('settings.py') # 第四种以类的方式 app.config.from_object('settings.DevelopmentConfig') @app.route('/login') def login(): return 'ojbk_login' if __name__ == '__main__': app.run()
.settings文件
DEBUG = True class Config(object): DEBUG = False TESTING = False DATABASE_URI = 'sqlite://:memory:' class ProductionConfig(Config): DATABASE_URI = 'mysql://user@localhost/foo' class DevelopmentConfig(Config): DEBUG = True class TestingConfig(Config): TESTING = True
四.fbv路由本质
# <string:nid> string是数据类型也可以int等等 #rule --->就是路由 #enpoint,取别名,如果没有就用当前函数名 #enpoint,不能重复 #methods=["POST","GET"] #view_func 就我们endpoint,指向的函数,也就请求该路由的时候,要响应函数 #app.add_url_rule(rule,‘取别名,反向解析’,login)
from flask import Flask,url_for app = Flask(__name__) # 配置文件1,但是这种方式只能配置2种 # 把debug给为True,只要你修改了代码,按ctrl+s就可以刷新 app.debug = True # @app.route('/login',methods=['GET','POST']) # decorator 真正的控制器函数,响应函数 # 源码里面有一个def decorator(f): f就是login def login(nid): print(type(nid),nid) return 'ojbk_login' # 路由本质 app.add_url_rule("/login/<string:nid>",view_func=login,endpoint='login',methods=['GET','POST']) # self.add_url_rule(rule,endpoint,f,**options) # <string:nid> string是数据类型也可以int等等 #rule --->就是路由 #enpoint,取别名,如果没有就用当前函数名 #enpoint,不能重复 #methods=["POST","GET"] #view_func 就我们endpoint,指向的函数,也就请求该路由的时候,要响应函数 #app.add_url_rule(rule,‘取别名,反向解析’,login) @app.route('/') def index(): # 怎么使用别名 real_url = url_for('login') return real_url if __name__ == '__main__': app.run()
五.cbv初识,路由的本质,cbv详解
''' # 这个view要传个名字,不然源码那边返回过来就是一个view #IndexView.as_view(name='index')都views.View里面的as_view的view #为什么要as_view(name='index'), #如果不指定,就都是view #所以必须指定 '''
from flask import Flask,url_for,views app = Flask(__name__) app.debug = True # 简单的写法 # class IndexView(views.View): # 如果你继承的是view,就必须用dispatch_request做分发,这是固定格式 # 我们需要做一个限制,到底是get请求还是post请求 # methods = ["POST","GET"] # def dispatch_request(self): # print('Index') # return 'Index' # 但是我们希望把这个get和post方法做成django的形式 # 通用的写法 class IndexView(views.MethodView): # 没写就不会读取,get post都行,如果写了就只能访问写的那一方 # methods = ["POST", "GET"] def get(self): print('Index') return 'Index,get' def post(self): return 'Index,post' ''' # 这个view要传个名字,不然源码那边返回过来就是一个view #IndexView.as_view(name='index')都views.View里面的as_view的view #为什么要as_view(name='index'), #如果不指定,就都是view #所以必须指定 ''' app.add_url_rule("/index",view_func=IndexView.as_view(name='index')) if __name__ == '__main__': app.run()