问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Flask表单疑问,这个name是怎么传进来的

发布网友 发布时间:2022-04-29 23:40

我来回答

2个回答

懂视网 时间:2022-05-02 21:13

=pymysql, # 使用链接数据库的模块 maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数 mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建 maxcached=5, # 链接池中最多闲置的链接,0和None不限制 maxshared=3, # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。 blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错 maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制 setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."] ping=0, # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always host=‘127.0.0.1‘, port=3306, user=‘root‘, password=‘123‘, database=‘pooldb‘, charset=‘utf8‘ )

 

我创建的连接池

import pymysql
from DBUtils.PooledDB import PooledDB, SharedDBConnection

POOL = PooledDB(
 creator=pymysql, # 使用链接数据库的模块
 maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数
 mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
 maxcached=5, # 链接池中最多闲置的链接,0和None不限制
 maxshared=3, # 链接池中最多共享的链接数量,
 # 0和None表示全部共享。
 # PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
 blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
 maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制
 setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
 ping=0, # ping MySQL服务端,检查是否服务可用.
 # 如:0 = None = never,
 # 1 = default = whenever it is requested,
 # 2 = when a cursor is created,
 # 4 = when a query is executed,
 # 7 = always
 host=‘192.168.233.128‘,
 port=3306,
 user=‘root‘,
 password=‘594504110‘,
 database=‘superCRM‘,
 charset=‘utf8‘
)

 

升级一下我的连接池, 类似于ORM

class SathQuery(object):
 _POOL = None

 def __new__(cls, *args, **kwargs):
 if not cls._POOL:
  cls._POOL = super().__new__(cls)
 return cls._POOL

 def __init__(self, user, password, database, charset, host="127.0.0.1", post=3306):
 self._POOL = PooledDB(
  creator=pymysql,
  maxconnections=6,
  mincached=2,
  maxcached=5,
  maxshared=3,
  blocking=True,
  maxusage=None,
  setsession=[],
  ping=0,
  host=host,
  port=post,
  user=user,
  password=password,
  database=database,
  charset=charset
 )

 def get_connection(self):
 """
 获取连接
 :return:
 """
 conn = self._POOL.connection()
 cursor = conn.cursor(pymysql.cursors.DictCursor)
 return conn, cursor

 def fetch_all(self, sql, args):
 """
 查询所有
 :param sql:
 :param args:
 :return:
 """
 conn, cursor = self.get_connection()
 cursor.execute(sql, args)
 result = cursor.fetchall()
 cursor.close()
 conn.close()
 return result

 def insert_one(self, sql, args):
 """
 查询一个
 :param sql:
 :param args:
 :return:
 """
 conn, cursor = self.get_connection()
 res = cursor.execute(sql, args)
 conn.commit()
 print(res)
 conn.close()
 return res

 def update(self, sql, args):
 """
 更新数据
 :param sql:
 :param args:
 :return:
 """
 conn, cursor = self.get_connection()
 res = cursor.execute(sql, args)
 conn.commit()
 print(res)
 conn.close()
 return res

 

使用高级一点的数据库连接池进行数据库操作

# 创建连接池
query = SathQuery("root", "594504110", "superCRM", "utf8", host="192.168.233.128")

# 进行数据库操作
print(query.fetch_all("select * from superCRM_customer where id=%s", (4,)))

print(query.insert_one("insert into superCRM_customer VALUES (%s,%s,%s)", (7, "sath", "66666")))

print(query.update("update user SET name=%s WHERE id=%s", ("wang", 1)))

 

flask第三方插件DBUtils

标签:分享   connect   多少   new   创建   custom   result   链接   self   

热心网友 时间:2022-05-02 18:21

没看form有关的源码,但是应该是这样的∶

首先,你得理解像flask这种MVC(或者说MTC)的基本运行机制。
- 对于flask的view,你得知道wsgi协议(如果不清楚,请自行Google之)。

更底层(逻辑上的底层)的HTTP utils(flask用的是werkzeug)将client端的HTTP requests等进行parse,并且将其构建为wsgi的environment(包含了request及其他信息)。

wsgi
server在process请求的过程是:根据wsgi协议构建environ,将其传入flask app
instance(这个即为flask框架实现的wsgi app),flask app
instance用这个environ和自己的``start_response``
method(这个也是uwsgi协议规约)完成请求处理并response。

flask有一个线程级(或greenlet)的request对象。在真正process response之前,将environ丢到这个request对象里,之后这个request跟着你的那个线程就成为了默契的炮友~~直至response完成或线程完蛋。

views里面的那一坨坨的route的作用是啥捏?这个就是url routing了,就是我在你的站点上点了一个特定的url,flask要如何满足你。你得说出你想要的东西吧。

那么views是什么时候用到呢?废话,当然还是在接收并理解请求之后到响应之前。


了,flask app instance在处理你的需求的时候从request对象里拿到了你请求的url,这个就相当于一把key,然后app
instance根据这个key去views里找到了对应的锁(你想要的处理逻辑,就是views里的route下面的function),这个锁啊,她
一旦被打开了,满足你需求的时刻也就快了 ~ ~
P.S. 至于如何匹配到这个锁的呢,这个就是url mapping了,就是一堆正则匹配(别小看这个,如果你用过flask的blueprint,你会明白写这么个mapping也是件爽hi了的事情咯)

- model & controller呢?
你的需求其实就是要flask给你response,response其实呢就是数据(不管是RESTFUL API还是template形式,都是你撸出的data)。

数据这坨翔实怎么来的呢?就是你从数据库(广义,包括sql & nosql db,内存级缓存,磁盘文件等等等等)拿到的,至于data的来源嘛,可能是你自己插的,或者是从别的地方哭着要来的。

model
就是干这活的,只不过它比较抽象,将数据库操作转成了对Python对象的操作(这个就是大名鼎鼎的ORM,其实并没有什么卵用,ORM写多了你连查询优
化都忘了,如果你有比较高的performance需求也有很多时间,就自己撸高效检索方案吧,我没少被这玩意儿坑%>_<%)。

controller这玩意儿你其实可以不要,不过为了做逻辑分离,让你撸业务撸的漂亮点儿还是用它吧。

OK,说了这么多,不知道有没有人能看懂,如果没看懂,让我思考会儿吧 ~ ~

========================================================================
简而言之呢,你用flask作application的时候,MVC各司其职堆好你产生data的逻辑即可,其它你一概不用管。

靠,终于可以回到你的问题上了:

先看下Form这玩意儿:
from flask.ext.wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import Required

class NameForm(Form):
name = StringField('What is your name?', validators=[Required()])
submit = SubmitField('Submit')

这就是一个类而已,和model里面的那些玩意儿没本质区别,也都是一个映射关系。model是将数据库啥的和Python对象映射;Form是将HTML表单(form)和这个从flask.ext.wtf.Form及其子类映射。

再来看看这玩意儿:
1 @app.route('/', methods=['GET', 'POST'])
2 def index():
3 name = None
4 form = NameForm()
5 if form.validate_on_submit():
6 name = form.name.data
7 form.name.data = ''
8 return render_template('index.html', form=form, name=name)

首先来分析一下执行过程:
哎呀,这个只是个route嘛,它哪有执行过程。
执行是由app instance做的嘛,好吧,其实它是被app instance做的。


展开之前看一下route后面那个 methods=['GET',
'POST']。这玩意的意思是说,当我遇到有与``index``(即上面route下面的那个index)匹配的的请求时,我可以用GET或者
POST方法,其他的像PUT、DELETE等HTTP verb我不让你丫玩儿。

当你把你的这个flask应用deploy到web server或者在本地run test server的时候,你在浏览器里输入 http://xxxxxx.ooooo.xxoo/index 的时候,你向server发射的是``GET``炮弹,flask instance接受了你的弹,然后route到了index这个函数,好吧,激动人心的时刻到了:

#3. name = None 这个就是个赋值
#4. form = NameForm() 好吧,这个就是NameForm类的实例化,拿到一个form object。
#5.
if form.validate_on_submit(): 呵呵,这个嘛,意思是问一下#2中实例化的form
object,SB,你是在被人(1)submit(提交)并且(2)提交满足我的要求么?
好吧,前面说过了,我是在GET,而没有在submit(submit在HTML中为POST),好吧,我连(1)都不满足,所以也就没有#6、#7什么
事儿了。
#8 好的,app instance终于快要向你回馈了。给我把前面的from object和name变量一起带到index.html这个文件里吧。
哈哈,终于有jinja2的活儿了,@题主, 你丫也把index.html发上来呀 = =
index.html
里你写了个表单,里面有个叫做``name``的field和一个``submit``按钮,这些field和你的``NameForm``对应,好了,
对应填充的活儿和就交给jinja2吧,它会给你一个最终将在用户浏览器显示的index.html。

view的使命完成了,它成功的生成了数据。

app instance 拿到了view的数据,也该向client端发最终响应了。OK,server完成了这次request的response,用户拿到最终想要的东西了。

浏览器或者UA干的活儿我就不展开了,我的手已经抽筋了,

现在在用户的浏览器上,看到了index.html,上面有一个表单,那个表单上面有个文本框(有``What is your name?``的placeholder)和一个Submit提交按钮。


了,用户在那个文本框中写了一个名字,比如``John``,然后按了那个``Submit``按钮,这次提交回向server发射一个``POST``
请求,这个请求里面会带上文本框的名字(哈哈,就是name)和文本框name里面的值(yeah,就是``John``)。然后呢,到flask
instance中,request对象(如果不知道这是什么东西,看前文)里就会有所有这些有关请求的数据了。

辣么,辣么这跟from有毛线关系呢????

其实吧,form中的数据是flask从request(request是从environ构建的)中拿到并映射进form属性中的(映射过程发生在你实例化form的时候),这个过程我也不展开了。好吧,不知道有没有解释你
name = form.name.data

为什么会有数据的疑问。


吧,总结起来就是,HTTP utils将用户的raw request解析成符合wsgi规范的environ,然后flask
instance将environ丢到线程级的request
object里,在你实例化flask.ext.wtf.Form及其子类时,会从request object里解析并映射数据到form中。

关于读书的话,如果你觉得你实在看不明白,那可能是有关web底层一点的知识稍微欠缺,可以补补这块的知识,对于框架的处理机制,最好的办法是 看!!!源!!!!码!!!!!

看不懂就补基础,如此而已。

上面过程都是我信手打出来的,也好久没用flask了,写的时候也没查资料,如有bug或建议可以告诉我,以便我修改。

最后希望能帮到你/你们。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 笔记本电脑屏幕开机锁忘记密码 怎么办?急死了 华硕笔记本电脑开机密码忘记了怎样找回?系统是Windows 7旗舰版... flask manager命令怎么用 我使用flask,那么我指定action发送给一个router, flask如何向前端传输GeoJson文件 鸿鑫人生两全保险(分红 如何把css,js文件发布到服务器上flask 如何用 flask 优雅的实现 restful api 高分请高手翻译英文简历 鸿鑫人生两全保险 分红型好吗 python+flask上传文件ioerror errno21 is a directory怎么解决... 如何写好商务英语专业的简历,我想从事外贸行业? 鸿鑫人生两全保险(分红型)适合哪些人买 flask怎么获取上传文件的大小和其他信息 牛仔服装英文简历范文 python flask 上传多个文件,代码怎么写? 我是英语教育专业毕业的,求一份应聘外贸业务员的英文自我介绍,多介绍对... 面试外贸跟单员 急需英文简历 帮帮忙吧 应聘外贸员的英文简历该怎么写 请帮我写篇英文简历 英文版简历要怎么写 英文面试自我简介范文,最好是外贸业务员的~ 悦木之源菌菇系列好用吗?! flask怎么使用request post接收文件 用python flask制作的网页上传到服务器后python如何获取网上用户提交的... Flask 框架怎么处理多级静态目录 qq添加好友失败请勿频繁操作要怎么解除 你有哪些收缩毛孔的产品可以推荐一下吗? qq好友添加失败请勿频繁操作怎么 QQ加人总显示操作频繁,添加失败怎么办? 老年手机响一声就自动接听怎么办 老人机会自动接通怎么办? yepen老年机翻盖接听设置在哪里- 问一问 老年机自动接听电话怎么回事 纽曼老人机被设置成了翻盖自动接听模式,遇到不想接的陌生来电一翻盖就自动接通了,怎样取消啊啊?烦啊! 一个钉钉两个人上课会被发现吗 老年机为什么自动接听 老人机自动接听是人为的吗? 老人机来电自动接听怎么回事 钉钉在线课堂刷视频会被发现吗 老人机的来电提醒功能怎么取消 华为老人机打电话进去约1分钟后自动接听模式怎么关掉