flask mysql 配置文件_Flask框架整理及配置文件

Flask基础部分

Flask目录结构(蓝图)

92b1412a11681bfd98514555da22424c.png

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

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

fcecaa27ea5212ceb9bf034c36bfbf34.gif

from flask importFlaskfrom pro_flask.views.user importuserfrom pro_flask.views.blog importblog

app= Flask(__name__, template_folder=‘templates‘)

app.register_blueprint(user)

app.register_blueprint(blog)

app.secret_key= "alex"

fcecaa27ea5212ceb9bf034c36bfbf34.gif

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

fcecaa27ea5212ceb9bf034c36bfbf34.gif

from pro_flask importappfrom flask_script importManagerfrom flask_bootstrap importBootstrap

Bootstrap(app)

manage=Manager(app)if __name__ == ‘__main__‘:#app.__call__()

manage.run()

fcecaa27ea5212ceb9bf034c36bfbf34.gif

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

fcecaa27ea5212ceb9bf034c36bfbf34.gif

from flask importBlueprint, session, redirect, url_for, render_template

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

@blog.route("/index/")defindex():return render_template("index.html")

@blog.before_request # 请求该蓝图中所有的函数时都会先走这儿!defprocess_request():

val= session.get("login")ifval:returnNoneelse:return redirect(url_for("user.login")) # 如果没有session则阻断请求

fcecaa27ea5212ceb9bf034c36bfbf34.gif

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

fcecaa27ea5212ceb9bf034c36bfbf34.gif

from flask importBlueprint, render_template, request, session, url_for, redirectfrom flask_wtf importFlaskFormfrom wtforms importStringField, PasswordField, SubmitFieldfrom wtforms.validators importDataRequired, EqualTo, Length, ValidationError

user= Blueprint("user", __name__, template_folder=‘templates‘)

@user.route("/login/", methods=["GET", "POST"])deflogin():if request.method == "POST":

username= request.form.get("username")

password= request.form.get("password")if username == "alex" and password == "123":

session["name"] = "alex"session["password"] = "123"session["login"] = 1

return redirect(url_for("blog.index"))return render_template("login.html")

@user.route("/logout/")deflogout():

session.pop("login")return render_template("base.html")classRegister(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("注册")defvalidate_username(self, field):if self.username.data == "alex":raise ValidationError("该用户已存在")

@user.route("/register/", methods=["GET", "POST"])defregister():

form=Register()ifform.validate_on_submit():return redirect(url_for("user.login"))return render_template("register.html", form=form)

fcecaa27ea5212ceb9bf034c36bfbf34.gif

加载静态资源的方法

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

实例:

{% block metas %}

{{ super() }}{% endblock %}

Flask原码部分理解

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

defrun(self):

...

from werkzeug.serving import run_simple

run_simple(host, port, self,**options) # 第三个参数self指的是app这个对象自己

...

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

a5ab13fbb3cc0102e30e971d0287712a.png

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

6c778aa8c91950471347e27840765eae.png

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

2e8c1a73a4e65c8319d0198eb0e94bf4.png

35befff8fe7f29a9b74d566596e7f9a5.png

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

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

23f4c54756fb6079960d45e80462be47.png

8048c0ece289b9ede7c50f34db6d46e4.png

跟进_request_ctx_stack

f50140916e8d4929138ae482a0f521a9.png

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

9626df8bd62b4b2d638837e32aae3d15.png

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

9d9a5b8e880ac320952f5a528a2d21b5.png

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

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

fcecaa27ea5212ceb9bf034c36bfbf34.gif

try:

from greenlet import getcurrent as get_ident # 如果有协程库,那么就支持协程

except ImportError:

try:

from thread import get_ident

except ImportError:

from _thread import get_ident # 支持线程

classLocal(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]exceptKeyError:raiseAttributeError(name)def __setattr__(self, name, value):

ident= self.__ident_func__()

storage= self.__storage__

try:

storage[ident][name]=value # 为每个协程/线程开辟空间,如果未开辟 则执行下面的代码exceptKeyError:

storage[ident]={name: value}def __delattr__(self, name):try:del self.__storage__[self.__ident_func__()][name]exceptKeyError:raise AttributeError(name)

fcecaa27ea5212ceb9bf034c36bfbf34.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值