Flask基础部分

Flask目录结构(蓝图)

views中存放蓝图,每个蓝图也可以有自己的模板,用蓝图对不同功能的视图函数进行隔离,类似于django中的app

pro_flask包的init.py文件, 用于注册所有的蓝图

from flask import Flask
from pro_flask.views.user import user
from pro_flask.views.blog import blog app = Flask(__name__, template_folder='templates')
app.register_blueprint(user)
app.register_blueprint(blog)
app.secret_key = "alex"

manage.py文件,作为整个项目的启动文件

from pro_flask import app
from flask_script import Manager
from flask_bootstrap import Bootstrap Bootstrap(app)
manage = Manager(app)
if __name__ == '__main__':
# app.__call__()
manage.run()

views包中的blog.py,必须要通过session验证才能访问,否则回到登录界面

from flask import Blueprint, session, redirect, url_for, render_template

blog = Blueprint("blog", __name__, template_folder='templates')

@blog.route("/index/")
def index():
return render_template("index.html") @blog.before_request # 请求该蓝图中所有的函数时都会先走这儿!
def process_request():
val = session.get("login")
if val:
return None
else:
return redirect(url_for("user.login")) # 如果没有session则阻断请求

views包中的user.py,定义一些与用户相关的视图函数

from flask import Blueprint, render_template, request, session, url_for, redirect
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo, Length, ValidationError user = Blueprint("user", __name__, template_folder='templates') @user.route("/login/", methods=["GET", "POST"])
def login():
if request.method == "POST":
username = request.form.get("username")
password = request.form.get("password")
if username == "alex" and password == "":
session["name"] = "alex"
session["password"] = ""
session["login"] = 1
return redirect(url_for("blog.index"))
return render_template("login.html") @user.route("/logout/")
def logout():
session.pop("login")
return render_template("base.html") class Register(FlaskForm):
  # username为表单中input中name属性对应的值, "用户名"为label的内容, balidators为验证器(写一些验证表单内容的规则)
username = StringField("用户名", validators=[DataRequired("用户名不能为空"), # 表单的验证器
Length(min=6, max=12, message="长度需要在6~12个字符之间")])
password = PasswordField("密码", validators=[DataRequired("密码不能为空"),
Length(min=6, max=12, message="密码长度需要在6~12个字符之间")])
confirm = PasswordField("确认密码", validators=[DataRequired("密码不能为空"), EqualTo("password", message="两次输入的密码不一致")])
submit = SubmitField("注册") def validate_username(self, field):
if self.username.data == "alex":
raise ValidationError("该用户已存在") @user.route("/register/", methods=["GET", "POST"])
def register():
form = Register()
if form.validate_on_submit():
return redirect(url_for("user.login"))
return render_template("register.html", form=form)

加载静态资源的方法

{{ url_for('static',filename='路径/文件名称.css/js/jpg') }}

实例:

{% block metas %}
{{ super() }}
<link rel="icon" href="{{ url_for('static',filename='img/1.jpeg',_external=True) }}">
{% endblock %}

Flask原码部分理解

app.run()方法,负责启动项目,监听请求,那么它在内部做了哪些操作呢???

def run(self):
...
   from werkzeug.serving import run_simple
   run_simple(host, port, self, **options) # 第三个参数self指的是app这个对象自己
   ...

以上是原码中app的run方法的部分内容,其实它执行的是run_simple这个方法

第三个参数将被反射调用,那么app(),就是去执行了app.__call__()方法

可以看出__call__方法其实是在调用wsgi_app这个接口

那么也就是说,将请求相关的所有内容都封装到了一个类的对象中

ctx = self.request_context(environ) # 此时的ctx就是请求的对象

跟进_request_ctx_stack

可以看出将那个请求对象push进了这个LocalStack类的对象里,跟进到LocalStack()中

找到这个push方法,这里的obj就是那个请求的对象

_local是在类初始化时,实例化的Local对象,反射这个Local对象中是否有stack这个属性或方法,如果没有,则执行_local.stack = [], rv = []

在rv列表中把那个请求对象加进来,而_local.stack = [],会触发Local里面的__setattr__方法,所以跟进到Local中查看,Local的实现原理类似于threading.Local


try:
from greenlet import getcurrent as get_ident # 如果有协程库,那么就支持协程
except ImportError:
try:
from thread import get_ident
except ImportError:
from _thread import get_ident # 支持线程
class Local(object):
__slots__ = ('__storage__', '__ident_func__') def __init__(self):
object.__setattr__(self, '__storage__', {}) # 使用这种方法不会触发下面的__setattr__方法,避免递归
object.__setattr__(self, '__ident_func__', get_ident)# 将获取唯一协程标识的方法赋值给了__ident_func__
   def __getattr__(self, name):
try:
return self.__storage__[self.__ident_func__()][name]
except KeyError:
raise AttributeError(name) def __setattr__(self, name, value):
ident = self.__ident_func__()
storage = self.__storage__
try:
storage[ident][name] = value # 为每个协程/线程开辟空间,如果未开辟 则执行下面的代码
except KeyError:
storage[ident] = {name: value} def __delattr__(self, name):
try:
del self.__storage__[self.__ident_func__()][name]
except KeyError:
raise AttributeError(name)

Flask框架整理的更多相关文章

  1. Flask框架整理及配置文件

    阅读目录 Flask目录结构(蓝图) pro_flask包的init.py文件, 用于注册所有的蓝图 manage.py文件,作为整个项目的启动文件 views包中的blog.py,必须要通过sess ...

  2. 面试简历书写、Flask框架介绍与快速使用、Flask演示登录页面、用户信息页面案例

    今日内容概要 面试简历编写 Flask框架介绍与安装 内容详细 1.面试简历编写 # 千万不要几个小时把简历凑出来 几天到一周 # 有没有面试机会,取决于简历写得怎么样 简历写好是第一步 # 投简历的 ...

  3. Flask 框架入门

    Flask Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . 安装 Flask 依赖两个外部库, We ...

  4. .NET平台常用的框架整理

    基于.NET平台常用的框架整理 DotNet | 2016-03-31 17:13 (点击上方蓝字,可快速关注我们) 来源:天使不哭 链接:http://www.cnblogs.com/hgmyz/p ...

  5. Flask框架获取用户IP地址的方法

    本文实例讲述了python使用Flask框架获取用户IP地址的方法.分享给大家供大家参考.具体如下: 下面的代码包含了html页面和python代码,非常详细,如果你正使用Flask,也可以学习一下最 ...

  6. Python自动化运维之30、Flask框架

    Flask 官网:http://flask.pocoo.org/ flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是 ...

  7. flask框架+pygal+sqlit3搭建图形化业务数据分析平台

    一. 前言 先说下主要的框架和主要的图形库的特点:(个人见解) Django:python开发的一个重量级的web框架,集成了MVC和ORM等技术,设计之初是为了使开发复杂的.数据库驱动的网站变得简单 ...

  8. python+unittest框架整理(一点点学习前辈们的封装思路,一点点成长。。。)

    预期框架整理目标: 1.单个用例维护在单个.py文件中可单个执行,也可批量生成组件批量执行 2.对定位参数,定位方法,业务功能脚本,用例脚本,用例批量执行脚本,常用常量进行分层独立,各自维护在单独的. ...

  9. 2nd_SE-结对编程1-基于flask框架的四则运算生成器

    0x00 Coding https://coding.net/u/nikochan/p/2nd_SE/git 0x01 写在前面 因为在上一个作业中,是基于python完成的Command程序.那么再 ...

随机推荐

  1. jsp (二) 练习

    package cn.sasa.serv; import java.io.IOException; import java.sql.SQLException; import java.util.Lis ...

  2. 【托业】toeic托业必背核心词汇_修正版

  3. eclipse web module版本问题:Cannot change version of project facet Dynamic Web Module to 2.5.

    Description    Resource    Path    Location    TypeCannot change version of project facet Dynamic We ...

  4. 解决wine中文字体方块或乱码

    从Windows使用字体 如果有一个安装了Windows的分区, 可以通过链接它们来使用其字体. 例如, Windows的C:\盘被挂载在/windows: # ln -s /windows/Wind ...

  5. ECMAScript6 入门教程 初学记录let命令 块级作用域

    一.基本语法-let命令 (1)ES6新增了let命令,用来声明变量.所声明的变量,只在let命令所在的代码块内有效. 循环的计数器,就很合适使用let命令.计数器i只在for循环体内有效,在循环体外 ...

  6. q次询问,每次给一个x,问1到x的因数个数的和。

    q次询问,每次给一个x,问1到x的因数个数的和. #include<cmath> #include<cstdio> #include<cstring> usingn ...

  7. C#-----类FileStream的使用

    1.枚举类FileMode 指定操作系统打开文件的方式 CreateNew  指定操作系统应创建一个新的文件 Create  指定操作系统应创建一个新的文件. 如果该文件已存在,则会覆盖它 Open  ...

  8. Python在金融量开源项目列表

    Python也已经在金融量化投资领域占据了重要位置,开源项目列表:

  9. Quartz.net定时任务框架的使用

    一:Nuget添加Quartz.net和Topshelf 二:新建HelloJob类继承IJob public class HelloJob : IJob       {            pub ...

  10. Docker Compose 常用命令

    Compose常用选项 # docker-compose主命令后面跟其他命令 docker-compose Usage: docker-compose [-f <arg>...] [opt ...