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. 【JVM】-NO.110.JVM.1 -【JDK11 HashMap详解】

    Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...

  2. 初识GitHub之GitHub issues

    事实上,GitHub最重要的一个功能之一就是Issue(问题),有了Issue,极大地提高了用户的互动性,也同时推动了代码的发展,因为一人智短,众人拾柴火焰高. 在他人的仓库中,我们发现了需要的代码, ...

  3. 初识github之项目创建

    登录github后,点击左上角logo章鱼猫,进入主页面,点击start a project ,此时进入新建项目的页面.在repostory name这一栏上写下你想创建的项目的名字.然后在descr ...

  4. matlab之中文字体乱码处理

  5. OpenStack-Neutron-VPNaaS-测试和使用

    准备 确认安全组规则允许vpn协议通过(tcp协议和icmp协议,测试的时候直接设置“进出”全开) 确认两个子网上的vm可以ping通对方路由的外网ip,确认下两个vm是否可以访问外网 测试环境 (1 ...

  6. tensorflow变量

    tensorflow变量: 1.神经网络中的参数权重,偏置等可以作为张量保存到tensorflow的变量中 2.tensorflow变量必须被初始化 3.可被保存到文件中,下次使用重新加载即可 ten ...

  7. GreenDao 使用和数据库升级

    1使用方法 一.添加依赖 在bulid.gradle文件下的dependencies下添加所需依赖   compile 'org.greenrobot:greendao:3.2.2' // add l ...

  8. 处理centos6或者7依赖关系(Nginx、MySQL、PHP)的方法

     yum -y install make gcc gcc-c++ gcc-g77 flex bison file libtool libtool-libs autoconf kernel-devel  ...

  9. 使用js方法时,调用的方法名明明一致,但就是不管用,解决

    前提:代码全部写对 问题:调用的方法名明明一致,但就是不管用 举例:写了个function delete(){}方法, 点击调用delete方法,onclik="delete()" ...

  10. #map+LCA# Codeforces Round #362 (Div. 2)-C. Lorenzo Von Matterhorn

    2018-03-16 http://codeforces.com/problemset/problem/697/C C. Lorenzo Von Matterhorn time limit per t ...