flask web开发注意事项
一、连接数据库
- 连接mysql的时候需要添加autocommit=True,否则当修改数据库的时候,数据库数据已经发生变化,但是flask还是读取修改前的数据。
- 中间件 middleware
request
当Flask应用处理请求时,它会根据从WSGI服务器收到的环境创建一个Request对象.因为工作者(取决于服务器的线程,进程或者协程)一次只能处理一个请求,所以在该请求期间请求数据可被认为是该工作者的全部数据。Flask对此的术语为本地请求before_request,teardown_request。 -
g:同一个请求中 共享数据
from flask import g
场景:验证用户信息
可以在同一请求之间共享g的内容,相当于实现了这个请求的一个全局变量#DB信息 db_config = { 'host' : "10.1.241.42", 'user' : "root", 'password' : "123456", 'database' : "ops", 'charset' : "utf8mb4", 'port' : 33306, 'autocommit' : True } #全局数据库连接 def link_db(): if 'db' not in g: con = pymysql.connect(**db_config) return con @app.before_request def before_request(): g.db = link_db() @app.teardown_request def teardown_request(exception): db = g.pop('db', None) if db is not None: db.close()
4.session
用来记录用户会话信息from flask import Flask, session, request
app = Flask(__name__)
app.config['SECRET_KEY'] = 'sfoowff'@app.route('/login/')
def login():
username = request.args.get('username')
pwd = request.args.get('pwd')
if username and pwd:
session['user'] = username
return '登陆成功'
return '账号密码不能为空'@app.route('/logout/')
def logout():
session.pop('user', None)
return '登出'5. 在Flask中使用requests库发送请求时,可以通过data和json参数来传递参数。
data参数用于传递表单数据,这些数据会被编码为表单形式的数据。您可以将一个字典作为data参数传递给requests.post()或requests.put()等方法。
python
复制
import requestsurl = 'http://example.com/endpoint'
data = {
'key1': 'value1',
'key2': 'value2'
}response = requests.post(url, data=data)
print(response.text)
在上述示例中,data参数接收一个字典类型的数据,requests.post()方法会将其编码为表单数据发送给目标URL。json参数用于传递JSON数据。您可以将一个字典作为json参数传递给requests.post()或requests.put()等方法。json参数会自动将数据转换为JSON格式,并设置请求头部的Content-Type为application/json。
python
复制
import requestsurl = 'http://example.com/endpoint'
data = {
'key1': 'value1',
'key2': 'value2'
}response = requests.post(url, json=data)
print(response.text)
在上述示例中,json参数接收一个字典类型的数据,requests.post()方法会将其转换为JSON数据并发送给目标URL。根据您的需求,选择适合您的数据格式的参数(data或json)来发送请求。如果需要发送表单数据,使用data参数;如果需要发送JSON数据,使用json参数。
6. 使用数据库链接池来操作数据库链接
6.1 pycharm无法导入DBUtils
- 下面的方式在DBUtils3.02版本无法导入
from DBUtils.PooledDB import PooledDB
(注意3.02版本只支持py3.5-3.10)
改为下面:
from dbutils.pooled_db import PooledDB - 6.2 static 文件引用的时候要使用 url_for('static',filename='xx.jpg'),这样的话就算静态文件url前缀变化了,这里也会自动变化。
6.3 配置settings.py和localsettings.py的时候,变量要大写,虽然不是强制的,但有可能导入配置的时候无法识别变量,所以还是按照约定俗成的写成大写变量。
6.4
HTML placeholder
placeholder属性指定文本框的占位符,当用户还没有输入值的时候,向用户显示默认的描述性说明或提示信息,为用户填写表单提供提示和额外指导。
基本的文本输入框, type 属性值为search、url、tel、email、number 的文本输入框,以及 textarea 等其他类型的文本输入框都支持 placeholder属性。
<input type="url" name="site" id="site" placeholder="http://www.waibo.wang/">
placeholder属性中的文本会默认以浅灰色出现在文本框中。当用户开始在文本框中输入文本时,浅灰色文本就会自动消失。如果用户在没有输入任何信息的情况下将焦点移开,浅灰色文本又会再次出现。
当一个文本框同时拥有 placeholder属性和非空的 value 属性时,value 的属性值会显示在文本框中。
由于 placeholder属性的值是不会被发送到服务器上,因此,在提交表单时,如果文本框中的值与 placeholder属性的值相同,浏览器会阻止提交表单,并显示警告信息。
HTML form相关配置参考:https://blog.csdn.net/a950809/article/details/78462565
6.5
在Python中,使用相对导入(使用.)来导入包或模块是允许的,但是有一些限制和要求。
首先,相对导入只能在包内部使用,而不能在独立的脚本文件中使用。相对导入是用来引用同一包中的其他模块或子包的。如果您在脚本文件中使用相对导入,会出现ImportError: attempted relative import with no known parent package错误。
其次,相对导入需要在包的__init__.py文件中设置正确的包结构。在包的__init__.py文件中,您需要使用from .或from ..等相对导入语句来定义包的内部结构。
在Python中,from .和from ..是用于相对导入的语法。
from .表示从当前包(当前模块所在的包)中导入模块或子包。from ..表示从当前包的父包中导入模块或子包。
这些相对导入语法用于在包内部引用其他模块或子包,而不依赖于绝对路径。相对导入通常用于构建模块和包之间的相互引用关系,以便更好地组织和管理代码。
请注意以下几点:
- 相对导入只能在包内部使用,而不能在独立的脚本文件中使用。在独立脚本文件中,应使用绝对导入或添加包标识符来导入模块。
- 相对导入需要在包的
__init__.py文件中设置正确的包结构。在包的__init__.py文件中,您需要使用from .或from ..等相对导入语句来定义包的内部结构。 - 相对导入的使用可能会受到Python版本和模块的执行方式的影响。特别是在使用脚本文件执行模块时,相对导入可能会导致问题。因此,建议在包内部使用相对导入,而在独立脚本文件中使用绝对导入。
在Python中,包(Package)和模块(Module)是组织和管理代码的两种主要方式。它们在功能和使用上有一些区别。
- 模块(Module):
- 模块是一个包含Python代码的文件,以
.py为扩展名。它可以包含变量、函数、类和可执行代码。 - 模块通常用于封装一个特定功能的代码集合,可以被其他模块或脚本文件导入和使用。
- 模块提供了一种组织和重用代码的方式,可以通过导入模块来访问其中的代码。
- 您可以使用
import语句导入模块,并使用模块名来访问其中定义的变量、函数和类。
- 模块是一个包含Python代码的文件,以
- 包(Package):
- 包是一个包含多个模块的目录,其中包含一个特殊的
__init__.py文件来标识它为一个包。 - 包允许将相关的模块组织在一起,形成一个逻辑上的代码集合。
- 包提供了更高级别的命名空间,以防止模块名称冲突,并允许更好的代码组织和管理。
- 您可以通过使用点号(
.)来访问包中的模块和子包。例如,package.module表示访问包package中的模块module。 - 包中的
__init__.py文件可以包含一些初始化代码,也可以定义导入时需要执行的内容。
- 包是一个包含多个模块的目录,其中包含一个特殊的
总结:
- 模块是一个包含Python代码的文件,用于封装和重用代码。
- 包是一个包含多个模块和子包的目录,用于组织和管理相关的代码。
- 模块和包都可以通过导入来使用其中的代码,但包提供了更高级别的代码组织和命名空间。
通过使用模块和包,您可以更好地组织和管理您的Python代码,并实现模块化和可重用性
- 模块(Module):

共有 0 条评论