❶ 如何在flask 中使用 service worker
Service Worker 是用来控制同一个 origin 下的缓存啊网络请求啥的,它被用来代替 appcache 。 Push API 是 Service Worker 其中的一个功能。 依赖于 service worker ,这意味着他们都需要在 https origin 下才能使用。
❷ flask配置生产环境
书接上文 flask与sqlAlchemy ,我们了解到
这一步的的测试可以看 一个小型的资源管理站
这里与直接上结果。
原flask使用的WSGI是python,但是很明显python作为HTTP解释器是效率低下的。而且,直接运行flask也是非常糟心的。比如集中配置,比如多进程多线程,比如socket通信,比如log管理,比如进程管理
将此文件放置在项目的根目录,并创建文件夹uwsgi
详见 https://www.jianshu.com/p/4c0fb2ed6083
flask+uWSGI已经能实现webserver的功能了,但是更加优秀的weberver还需要nginx的辅助。
Nginx(发音同engine x)是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。
还有写拓展处理 主要看服务配置
这里 nginx -s reload 已经完成了服务配置。如果不想配置服务,直接到nginx根目录运行 ./sbin/nginx
这里给大家推荐一个不错的平台:Cloudflare
Cloudflare
在使用之前我们需要更换自己的顶级域名代理商,这一步此处以腾讯云截图:
跳过注册等过程,我们直接进入域名管理界面,看到
然后创建密钥
xxx.pem
xxx.key
再扔到服务器上去。
最后再配置nginx
总结配置flask一般形态的生产环境nginx+uwsgi+flask
回到目录
❸ flask web开发遇到sqlalchemy 查询为None怎么解决
讲数据库操作了
创建表
首先,我们要让Flask-SQLAlchemy 根据模型类创建数据库。方法是使用db.create_all()
函数:
(venv) $ python hello.py shell
>>> from hello import db
>>> db.create_all()
插入行
下面这段代码创建了一些角色和用户:
>>> from hello import Role, User
>>> admin_role = Role(name='Admin')
>>> mod_role = Role(name='Moderator')
>>> user_role = Role(name='User')
>>> user_john = User(username='john', role=admin_role) #User类虽然没有role属性,但是在上一章节里面的Role里面设置了一个backref属性,就是用来反向作用的。
>>> user_susan = User(username='susan', role=user_role) #注意啊,这里的role=user_role针对的是上一章节里面说的,对应的是模型对象!不是键的值!!!
>>> user_david = User(username='david', role=user_role)
模型的构造函数接受的参数是使用关键字参数指定的模型属性初始值。注意,role 属性也可使用,虽然它不是真正的数据库列,但却是一对多关系的高级表示。这些新建对象的id属性并没有明确设定,因为主键是由Flask-SQLAlchemy 管理的。现在这些对象只存在于Python 中,还未写入数据库。因此id 尚未赋值:
>>> print(admin_role.id)
None
>>> print(mod_role.id)
None
>>> print(user_role.id)
None
通过数据库会话管理对数据库所做的改动,在Flask-SQLAlchemy 中,会话由db.session表示。准备把对象写入数据库之前,先要将其添加到会话中:
>>> db.session.add(admin_role)
>>> db.session.add(mod_role)
>>> db.session.add(user_role)
>>> db.session.add(user_john)
>>> db.session.add(user_susan)
>>> db.session.add(user_david)
或者简写成
db.session.add_all([admin_role, mod_role, user_role,
... user_john, user_susan, user_david])
这里的session首先是和前面章节讲的HTTP里面的session不一样的
不过我感觉作用是类似的,相当于一个缓存的作用,把实例化生成的对象存放在session里面
最后通过commit命令执行保存在数据库内。
db.session.commit()
接着,再去查看属性,已经有了
>>> print(admin_role.id)
1
>>> print(mod_role.id)
2
>>> print(user_role.id)
3
修改行
在数据库会话上调用add() 方法也能更新模型。我们继续在之前的shell 会话中进行操作,下面这个例子把"Admin" 角色重命名为"Administrator":
>>> admin_role.name = 'Administrator'
>>> db.session.add(admin_role)
>>> db.session.commit()
删除行
数据库会话还有个delete() 方法。下面这个例子把"Moderator" 角色从数据库中删除:
>>> db.session.delete(mod_role)
>>> db.session.commit()
查询行
Flask-SQLAlchemy 为每个模型类都提供了query 对象。最基本的模型查询是取回对应表中
的所有记录:
>>> Role.query.all()
[<Role u'Administrator'>, <Role u'User'>]
>>> User.query.all()
[<User u'john'>, <User u'susan'>, <User u'david'>]
使用过滤器可以配置query 对象进行更精确的数据库查询。下面这个例子查找角色为"User" 的所有用户:
>>> User.query.filter_by(role=user_role).all()
[<User u'susan'>, <User u'david'>]
filter_by()等过滤器在query 对象上调用,返回一个更精确的query 对象。多个过滤器可以一起调用,直到获得所需结果。
关系和查询的处理方式类似。下面这个例子分别从关系的两端查询角色和用户之间的一对多关系:
>>> users = user_role.users
>>> users
[<User u'susan'>, <User u'david'>]
>>> users[0].role
<Role u'User'>
这个例子中的user_role.users 查询有个小问题。执行user_role.users 表达式时,隐含的查询会调用all() 返回一个用户列表。query 对象是隐藏的,因此无法指定更精确的查询
过滤器。就这个特定示例而言,返回一个按照字母顺序排序的用户列表可能更好。在示例5-4 中,我们修改了关系的设置,加入了lazy = 'dynamic' 参数,从而禁止自动执行查询。
示例5-4hello.py:动态关系
class Role(db.Model):
# ...
users = db.relationship('User', backref='role', lazy='dynamic')
# ...
这样配置关系之后,user_role.users 会返回一个尚未执行的查询,因此可以在其上添加过
滤器:
>>> user_role.users.order_by(User.username).all()
[<User u'david'>, <User u'susan'>]
>>> user_role.users.count()
2
我的理解是,通过添加lazy参数后,他生成的对象就是不直接显示内容,而是要通过过滤器才能显示的。
❹ python flask request怎么接收数组值
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创见函数,这被叫做用户自定义函数。 一、定义一个函数 ...
❺ flask web开发遇到sqlalchemy 查询为None怎么解决
一、fliter_by(port=data)这样才对!!你定义model的时候明明是用的“port”来定义label,查询的时候当然也要用“port”
二、讲数据库操作了
创建表
首先,我们要让Flask-SQLAlchemy 根据模型类创建数据库。方法是使用db.create_all()
函数:
(venv) $ python hello.py shell
>>> from hello import db
>>> db.create_all()
插入行
下面这段代码创建了一些角色和用户:
>>> from hello import Role, User
>>> admin_role = Role(name='Admin')
>>> mod_role = Role(name='Moderator')
>>> user_role = Role(name='User')
>>> user_john = User(username='john', role=admin_role)
#User类虽然没有role属性,但是在上一章节里面的Role里面设置了一个backref属性,就是用来反向作用的。
>>> user_susan = User(username='susan', role=user_role)
#注意啊,这里的role=user_role针对的是上一章节里面说的,对应的是模型对象!不是键的值!!!
>>> user_david = User(username='david', role=user_role)
模型的构造函数接受的参数是使用关键字参数指定的模型属性初始值。注意,role
属性也可使用,虽然它不是真正的数据库列,但却是一对多关系的高级表示。这些新建对象的id属性并没有明确设定,因为主键是由Flask-SQLAlchemy
管理的。现在这些对象只存在于Python 中,还未写入数据库。因此id 尚未赋值:
>>> print(admin_role.id)
None
>>> print(mod_role.id)
None
>>> print(user_role.id)
None
通过数据库会话管理对数据库所做的改动,在Flask-SQLAlchemy
中,会话由db.session表示。准备把对象写入数据库之前,先要将其添加到会话中:
>>> db.session.add(admin_role)
>>> db.session.add(mod_role)
>>> db.session.add(user_role)
>>> db.session.add(user_john)
>>> db.session.add(user_susan)
>>> db.session.add(user_david)
或者简写成
db.session.add_all([admin_role, mod_role, user_role,
... user_john, user_susan, user_david])
这里的session首先是和前面章节讲的HTTP里面的session不一样的
不过我感觉作用是类似的,相当于一个缓存的作用,把实例化生成的对象存放在session里面
最后通过commit命令执行保存在数据库内。
db.session.commit()
接着,再去查看属性,已经有了
>>> print(admin_role.id)
1
>>> print(mod_role.id)
2
>>> print(user_role.id)
3
修改行
在数据库会话上调用add() 方法也能更新模型。我们继续在之前的shell 会话中进行操作,下面这个例子把"Admin"
角色重命名为"Administrator":
>>> admin_role.name = 'Administrator'
>>> db.session.add(admin_role)
>>> db.session.commit()
删除行
数据库会话还有个delete() 方法。下面这个例子把"Moderator" 角色从数据库中删除:
>>> db.session.delete(mod_role)
>>> db.session.commit()
查询行
Flask-SQLAlchemy 为每个模型类都提供了query 对象。最基本的模型查询是取回对应表中
的所有记录:
>>> Role.query.all()
[, ]
>>> User.query.all()
[, , ]
使用过滤器可以配置query 对象进行更精确的数据库查询。下面这个例子查找角色为"User" 的所有用户:
>>> User.query.filter_by(role=user_role).all()
[, ]
filter_by()等过滤器在query 对象上调用,返回一个更精确的query 对象。多个过滤器可以一起调用,直到获得所需结果。
关系和查询的处理方式类似。下面这个例子分别从关系的两端查询角色和用户之间的一对多关系:
>>> users = user_role.users
>>> users
[, ]
>>> users[0].role
这个例子中的user_role.users 查询有个小问题。执行user_role.users 表达式时,隐含的查询会调用all()
返回一个用户列表。query 对象是隐藏的,因此无法指定更精确的查询
过滤器。就这个特定示例而言,返回一个按照字母顺序排序的用户列表可能更好。在示例5-4 中,我们修改了关系的设置,加入了lazy = 'dynamic'
参数,从而禁止自动执行查询。
示例5-4hello.py:动态关系
class Role(db.Model):
# ...
users = db.relationship('User', backref='role', lazy='dynamic')
# ...
这样配置关系之后,user_role.users 会返回一个尚未执行的查询,因此可以在其上添加过
滤器:
>>> user_role.users.order_by(User.username).all()
[, ]
>>> user_role.users.count()
2
我的理解是,通过添加lazy参数后,他生成的对象就是不直接显示内容,而是要通过过滤器才能显示的。
❻ flask 加载css不成功问题
是整个css文件不成功,还是单独一个css不行,如果是整个文件不好使就是路径问题,如果是单独一个不好使就是引用问题。如果都没错就清理缓存重新打开网页看看
❼ python flask rest怎么传参数
Client-Server:服务器端与客户端分离。
Stateless(无状态):每次客户端请求必需包含完整的信息,换句话说,每一次请求都是独立的。
Cacheable(可缓存):服务器端必需指定哪些请求是可以缓存的。
Layered System(分层结构):服务器端与客户端通讯必需标准化,服务器的变更并不会影响客户端。
Uniform Interface(统一接口):客户端与服务器端的通讯方法必需是统一的。
❽ Flask视图:视图函数,类视图,蓝图使用方法整理
摘要: Flask , 视图 , 视图函数 , 类视图 , 方法视图 , 装饰器 , 蓝图
在Flask中 路由 是指用户请求的 URL 与 视图函数 之间的 映射 ,处理URL和函数之间关系的程序称为路由。Flask根据HTTP请求的URL在路由表中匹配预定义的URL找到对应的视图函数。将视图函数的执行结果返回给服务器。
Flask中默认使用 @app.route 装饰器将视图函数和URL绑定,装饰器是一种接受函数的函数,返回新的函数。
使用装饰器将视图函数page和url '/'关系绑定带 app.url_map 属性上,打印app.url_map的结果如下,有两条url规则,分别是根目录下的URL规则和static目录下的URL规则
可以给装饰器增加 endpoint 参数给 url命名 ,一旦使用了endpoint参数 url_for 反转就不能使用视图函数名了而要使用定义的url名。
url_for('index')的输出是字符串格式url的内容"/"
也可以不使用装饰器,使用 add_url_rule 将视图函数和url绑定,装饰器 @app.route 实际是调用的 add_url_rule 方法
视图函数也可以结合类来实现,类视图的好处是支持 继承 ,可以将共性的东西放到父类中,类视图需要使用 app.add_url_rule() 来进行注册,类视图分为 标准类视图 和 基于调度方法的类视图
标准类视图有标准的写法
使用类视图,在父类中定义一个属性,在子类中完成各自的业务逻辑,同时都继承父类中的这一个属性
分别定义三个子类的模板
查看结果,三个url的返回除了三个模板各自的内容外都需要输出父类的ads属性
如果同一个视图函数需要根据 不同的请求方式 进行不一样的逻辑处理,需要在视图函数内部进行判断,可以使用 方法类视图 实现,使用类继承 flask.views.MethodView ,定义和请求方式 同名的小写方法 来完成了逻辑处理。
编辑一个页面直接访问是输出用户名密码页面,提交表单后是密码正确与否的提示。
在html中定义 form 标签action属性关联url名
如果不用方法视图实现需要在普通视图内部调用 request.method 判断是否为 GET , POST 进行判断
装饰器的本质是一个Python函数, 接受一个函数 , 返回一个函数 ,目的是让一个函数获得 其他额外的功能 。
假设一个场景访问新闻详情页又一个函数实现,但是之前必须先登录,登录由另一个函数实现,此时需要将访问新闻函数传递给登录函数返回一个新的函数作为整体的逻辑实现,这个给登录函数增加新功能浏览网页的过程就是装饰器。
控制台输出,new_func()执行了新函数,基础函数user_login执行了新加入的功能,新函数真实的函数名还是inner
如果使用装饰器魔法符号实现,此时直接调用被装饰的函数即可实现带有新功能的基础函数,函数作为参数传入的过程已经自动实现
在基础函数和要包装的函数上都支持传递参数
查看 app.route() 的源码内部也是将视图函数包装,在原函数执行之前调用 add_url_rule 绑定url,endpoint和视图函数的关系,再返回原函数实现业务逻辑
蓝图的目的是实现 各个模块的视图函数写在不同的py文件中 ,在主视图中导入分路由视图的模块,并注册蓝图对象, 降低各个功能模块的耦合度 ,使用 flask.Blueprint 定义蓝图, app.register_blueprint 注册蓝图。
实现主页,详情页,对比页三个页面,在主页中导入两个其他功能页,先编写两个功能页的蓝图detail.py和compare.py
使用 app = Blueprint('detail', __name__) 定义蓝图对象, detail 是蓝图名,蓝图名不能重复。再编写主视图main.py,在主视图中注册之前的蓝图,其他视图函数的名字不能和蓝图名一致
查看效果
如果在蓝图的py脚本中调用了 url_for ,需要把蓝图的name(就是 name 之前的)也加入作为前缀,如下