特点:

  短小精悍,可扩展性强

  依赖wsgi:werkzurg

werkzurg示例:

  1. from werkzeug.wrappers import Request, Response
  2. from werkzeug.serving import run_simple
  3.  
  4. def run(environ,start_response):
  5.  
  6. return [b"asdfasdf"]
  7.  
  8. if __name__ == '__main__':
  9.  
  10. run_simple('localhost', 4000, run)

最简单的实现形式

  1. from werkzeug.wrappers import Request, Response
  2.  
  3. @Request.application
  4. def hello(request):
  5. return Response('Hello World!')
  6.  
  7. if __name__ == '__main__':
  8. from werkzeug.serving import run_simple
  9. run_simple('localhost', 4000, hello)

正常的内部实现形式

  1. #访问index则可以得到Hello World
  2.  
  3. from flask import Flask
  4. app = Flask(__name__)
  5.  
  6. @app.route("/index")
  7. def run():
  8. return "Hello World"
  9.  
  10. if __name__ == "__main__":
  11. app.run()

九行代码实现网页

实现一个登陆验证的功能:

  1. from flask import Flask,render_template,request,redirect,session
  2. app = Flask(__name__) #一般用__name__,但是用其他只要是字符串都行
  3. app.secret_key = "asdfsg" #给session加密的盐
  4.  
  5. @app.route("/login",methods=["GET","POST"])
  6. def login():
  7. if request.method == "GET":
  8. return render_template("login.html")
  9. user = request.form.get("user") #request.args相当于request.GET,request.form相当于request.POST
  10. pwd = request.form.get("pwd")
  11. if user=="xxx" and pwd=="xxx":
  12. session["user"] = user #flask的session其实是cookie,但是加了密
  13. return redirect("/index")
  14. else:
  15. return render_template("login.html",error="用户名或密码错误") #或者可以写成**{error:"用户名或密码错误"}
  16.  
  17. @app.route("/index") #不写methods默认只接受GET请求
  18. def index():
  19. user = session.get("user")
  20. if not user:
  21. return redirect("/login")
  22. return render_template("index.html")
  23.  
  24. if __name__ == "__main__":
  25. app.run()

  flask的session是把数据以加密的方式保存在用户的浏览器中。

  静态文件和模板路径可以在app = Flask(__name__, xxxxxx) 里配置。

一、配置文件

  1. from flask import Flask
  2. app = Flask(__name__)
  3. app.config #里面保存所有配置信息,是一个字典形式的数据
  4. app.config.from_object("settings.Dev") #修改配置信息,将Dev类中的静态字段的值赋值给配置文件中同名的值

实现源码:

  1. class Flask(xxx):
  2. def from_object(self, obj):
  3. if isinstance(obj, string_types):
  4. obj = import_string(obj)
  5. for key in dir(obj):
  6. if key.isupper():
  7. self[key] = getattr(obj, key)
  1. import importlib
  2. def import_string(obj):
  3. p, c = obj.rsplite(".", maxsplit=1)
  4. m = importlib.import_module(p)
  5. cls = getattr(m, c)
  6. return cls

二、路由系统

  1. from flask import url_for
  2. @app.route("/index", methods=["GET",], endpoint="n") #如果不写endpoint,则默认是函数名index
  3. def index():
  4. print(url_for("n")) #反向生成url,返回“/index”
  5. return "index"

url中传参数:

  1. @app.route("/index/<nid>",methods=["GET",])
  2. def index(nid):
  3. print(nid) #得到参数
  4. print(url_for("index",nid=123)) #得到 /index/nid

1、路由系统的源码实现:

  1. class Flask:
  2. def route(self,rule,**options):
  3. def decorator(f):
  4. endpoint = options.pop('endpoint',None)
  5. self.add_url_rule(rule,endpoint,f,**options)
  6. return f
  7. return decorator
  8.  
  9. #所有这个装饰器实际上就是执行add_url_rule函数

app.route(xxx)的源码

  1. def add_url_rule(self, rule, endpoint=None, view_func=None,
  2. provide_automatic_options=None, **options):
  3. if endpoint == None:
  4. endpoint = _endpoint_from_view_func(view_func) #返回函数的__name__,即函数名
  5.  
  6. 。。。。。。
  7.  
  8. if view_func is not None:
  9. old_func = self.view_functions.get(endpoint) #这是一个字典,一开始是空,会加入endpoint和函数的对应关系
  10. if old_func is not None and old_func != view_func: #如果这个endpoint已经对应了一个函数,并且这个函数和当前要绑定的函数不一样,则报错
  11. raise 错误
  12. self.view_functions[endpoint] = view_func #否则就在view_functinos字典中加入这个对应关系

add_url_rule源码

2、参数:

  1. subdomain 子域名访问
  2. app.config["SERVER_NAME"] = xxxx
  3.  
  4. @app.route("/",subdomain="user") #访问“user.xxx"调用
  5. def index():
  6. return
  7.  
  8. redirect_to 永久重定向
  9. strict_slashes=False 地址后面加上/也可以访问

3、CBV

  1. from flask import views
  2.  
  3. class UserView(views.MethodView):
  4. #methods = ["GET",] 加上这句就限制可以接受的方法
  5. #decorators = [wrappers,] 对每一个函数加上一个装饰器,也可以在每个函数上单独加
  6.  
  7. def get(self,*args,**kwargs):
  8. return
  9.  
  10. app.add_url_rule("/user",None,UserView.as_view("endpoint"))

4、自定义正则

  1. from wekzerg.routing import BaseConverter
  2. class RegexConvertoer(BaseConverter):
  3. def __init__(self,map,regex):
  4. super(RegexConverter,self).__init__(map)
  5. self.regex = regex
  6.  
  7. def to_python(self,value):
  8. #路由匹配成功后把value传递给视图函数
  9. return value
  10.  
  11. def to_url(self,value):
  12. #反向解析url时
  13. val = super(RegexConverter,self).to_url(value)
  14. return val
  15.  
  16. @app.route("/index/<regex('/d+'):val>")
  17. def index(val):
  18. print(val)
  19. return xxx

三、视图

四、请求相关

  1. request.method
  2. request.args
  3. request.form
  4. request.files
  5. request.headers
  6. request.cookies

五、响应相关

  1. return "index"
  2. return redirect("/index")
  3. return render_template("index.html")
  4.  
  5. dic = {"p":1}
  6. return jsonify("dic") #自动序列化
  7.  
  8. #除了重定向都可以设置响应头
  9. from flask import make_response
  10.  
  11. obj = make_response("index")
  12. #obj = make_response(jsonify(dic))
  13. #obj = make_response(render_template("index.html"))
  14. obj.headers["xxx"] = 123
  15.  
  16. #设置cookie
  17. obj.set_cookie("key","value")

**三种方式实现登录验证

  方式一:在每个视图函数中加入判断(不用)

  方式二:在需要验证的视图函数前加一个装饰器

  1. import functools
  2.  
  3. def auth(func):
  4. @functools.wraps(func) #这样装饰器所修饰的函数的信息不会被改变,避免出现函数名都是inner,导致反向解析url报错的问题
  5. def inner(*args,**kwargs):
  6. #省略
  7. ret = func(*args,**kwargs)
  8. return ret
  9. return inner
  10.  
  11. @app.route("/index", methods=["GET",])
  12. @auth
  13. def index():
  14. return render_template("index.html")

  方式三:before_request

  1. @app.before_request
  2. def auth():
  3. if request.path == "/login":
  4. return None #return None就表示pass
  5. if session["user"]:
  6. return None
  7. return redirect("/login")
  8.  
  9. @app.route("/login", methods=["GET", "POST",])
  10. def login():
  11. if request.method == "post":
  12. session["user"] = request.form.user
  13. else:
  14. return render_template("login.html")

六、模板渲染

  --解除标签限制两种方式:在视图中Markup, 在模板中 |safe

  --函数调用两种方式:直接函数名加括号, 或者在视图中定义函数时加上@app.template_global()装饰器,可以直接调用

  --模板的继承同django,extends和block

七、session

  flask的session操作和操作字典一样,在响应时将session数据序列化并加密,在请求时将数据解密并反序列化成字典。

八、闪现

  本质就是把数据先保存在session中,取数据时使用pop

  1. from flask import flash,get_flash_messages
  2.  
  3. app = Flask(__name__)
  4.  
  5. @app.route("/test1")
  6. def test1():
  7. flash("数据1", category="info") #category是分类,可以不写,默认是messages
  8. "
  9.  
  10. @app.route("/test2")
  11. def test2():
  12. print(get_flash_messages(category="info")) #可以不加参数

九、中间件

  flask没有提供中间件功能,但是可以通过替换app.__call__方法来实现中间件的作用,还可以通过before_request和after_request实现

  1. def MiddleWare(object):
  2. def __init__(self,old):
  3. self.old = old
  4.  
  5. def __call__(self,*args,**kwargs):
  6. print("前")
  7. ret = self.old(*args,**kwargs)
  8. print("后")
  9. return ret
  10.  
  11. if __name__ == "__main__":
  12. app.__call__ = MiddleWare(app.__call__)
  13. app.run()

十、特殊的装饰器

  1. @before_request
  2. @after_request
  3. @template_filter()
  4. @template_global()@errorhandle(404)

flask学习(一)的更多相关文章

  1. [ZHUAN]Flask学习记录之Flask-SQLAlchemy

    From: http://www.cnblogs.com/agmcs/p/4445583.html 各种查询方式:http://www.360doc.com/content/12/0608/11/93 ...

  2. Flask 学习目录

    Flask 学习目录 Flask 的学习过程是一个了解如何从单个模块搭建一个 Web 框架的过程. Python.Flask 的安装和设置 简单的 Hello World 程序 使用 Jinjia2 ...

  3. Python Flask学习笔记之模板

    Python Flask学习笔记之模板 Jinja2模板引擎 默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板.Flask提供的render_template函数把Jinja ...

  4. Python Flask学习笔记之Hello World

    Python Flask学习笔记之Hello World 安装virtualenv,配置Flask开发环境 virtualenv 虚拟环境是Python解释器的一个私有副本,在这个环境中可以安装私有包 ...

  5. Flask学习-Wsgiref库

    一.前言 前面在Flask学习-Flask基础之WSGI中提到了WerkZeug,我们知道,WerkZeug是一个支持WSGI协议的Server,其实还有很多其他支持WSGI协议的Server.htt ...

  6. Flask 学习篇二:学习Flask过程中的记录

    Flask学习笔记: GitHub上面的Flask实践项目 https://github.com/SilentCC/FlaskWeb 1.Application and Request Context ...

  7. Flask 学习(四)静态文件

    Flask 学习(四)静态文件 动态 web 应用也需要静态文件,一般是 CSS 和 JavaScript 文件.理想情况下你的服务器已经配置好提供静态文件的服务. 在开发过程中, Flask 也能做 ...

  8. Flask 学习(三)模板

    Flask 学习(三)模板 Flask 为你配置 Jinja2 模板引擎.使用 render_template() 方法可以渲染模板,只需提供模板名称和需要作为参数传递给模板的变量就可简单执行. 至于 ...

  9. Flask 学习(一)概述及安装

    Flask 概述及安装 Flask 简介 Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . 官方网址 ...

  10. Flask学习目录

    目录 Flask学习初识 Flask学习二

随机推荐

  1. ABP之session

    ABP提供了一个IAbpSession接口,可以在不使用ASPNET的session的情况下获取当前用户和租户.IAbpSession还被ABP中的其他结构(如设置和授权系统)完全集成和使用. 注入s ...

  2. vue登录拦截

  3. 菜鸟学IT之简易四则运算程序开发

    作业要求来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2166 作业要求: 任何编程语言都可以,命令行程序接受一个数字输入,然后 ...

  4. 【c语言】分配内存与释放内存

    提示:现在内存区定出一片相当大的连续空间(如1000字节).然后开辟与释放都在此空间进行.假设指针变量p原已指向未用空间的开头,调用alloc(n)后,开辟了n个字节可供程序适使用.现在需要使 p的值 ...

  5. JS中的事件委托(事件代理)

    一步一步来说说事件委托(或者有的资料叫事件代理) js中事件冒泡我们知道,子元素身上的事件会冒泡到父元素身上. 事件代理就是,本来加在子元素身上的事件,加在了其父级身上. 那就产生了问题:父级那么多子 ...

  6. Python基础:搭建开发环境(1)

    1.Python语言简介 2.Python环境 Python环境产品存在多个. 2.1 CPython CPython是Python官方提供的.一般情况下提到的Python就是指CPython,CPy ...

  7. EL和 JSTL? 在JSP中简化 java代码的写法!

    一.servlet部分 package com.aaa.servlet; import com.aaa.dao.IStudentDAO; import com.aaa.dao.Impl.Student ...

  8. [ffmpeg] 定制滤波器

    如果有定制ffmpeg滤波器的需求,有两个结构体是必须要了解的:AVFilter.AVFilterPad,所定制的滤波器主要就是通过填充这两个结构体来实现的.我们下面将详细解析这两个结构体,并通过对滤 ...

  9. [数据库] windows server 2003下mysql出现10048错误的解决办法 Can't connect to MySQL server on '127.0.0.1' (10048)(抄)

    网站访问量大了的时候mysql连接数自然就多了,当超出mysql最大连接数的时候就会出现错误,当出现too many字样的错误的时候一般是因为连接数的问题,只需要修改最大连接数max_conectio ...

  10. java文件运行的过程

    javac .java——>编译成.class文件(字节码) 参考: https://www.cnblogs.com/yxwkf/p/3855363.html https://www.jians ...