flask框架,flasksqlalchemyy,jQuery和MySQL的相关问题,不是具体问题,关系有点糊涂请指教

欢迎使用 Flask & Flask 0.10.1 documentation
欢迎使用 Flask
欢迎阅读 Flask 文档。本文档由很多部分构成。我强烈推荐你们从
开始,接着可以浏览下 。比起快速入门(
), 内容更详细一些,该文档介绍了如何创建一个完整(尽管很小)的 Flask 应用。如果你想要深入研究 Flask 的话,可以查看
章节中描述一些常见的模式。
Flask 依赖着两个外部库:
模板引擎以及
WSGI 工具集。本文档并不包含这两个库的文档,查看它们的文档请移步:
这部分的文档比较松散,以介绍 Flask 背景开始,然后集中阐述了用 Flask 进行 web 开发的步骤。
如果你在寻找一个特定函数、类或方法的信息,那么这部分文档就是为你准备的。
这部分文档包含:设计说明,法律信息以及变更记录,有兴趣的读者可以参看。Web后端(11)
问题:如果我有一个用户登录,则我将他的user_id存入到session中去,session又是dict的形式,那么我服务器运行时候有那么多的用户登录,session是怎么存储在服务器中的呢?
flask和我之前用过的其他框架有一点不同的是,它的session默认是完全保留在客户端浏览器中的,也就是说我往flask的session中写入数据,最终这些数据将会以json字符串的形式,经过base64编码写入到用户浏览器的cookie里,也就是说无须依赖第三方数据库保存 session数据,也无需依赖文件来保存,这一点倒是挺有意思
flask默认的是 client side session
Flask by default usesthe Werkzeug provided 'secure cookie' as session system. It works by picklingthe session data, compressing it and base64 encoding it.
flask用的secure cookie方式保存session, 即session数据是加密后保存在用户cookie里. secure cookie是flask唯一自带的session方案
因此如果用flask session会话管理来实现单点登录,必须要使用服务端session,改进session方案:
Flask -login使用详细的例子:
FLASK redis 构建查询界面:
flask框架应用以及源码详解:
flask-mysql:
flask-mysqldb good!!
mysql-Python安装出错:
连接mariadb:
flask 的context机制:
在概念上,App Context 代表了“应用级别的上下文”,比如配置文件中的数据库连接信息;Request Context 代表了“请求级别的上下文”,比如当前访问的 URL
我们知道对一个 Flask App 调用app.run() 之后,进程就进入阻塞模式并开始监听请求
WSGI的作用:
Python数据结构小结:
radis:下载
sqlachemal 操作数据库
Python sqlachemy 操作mysql
flask-sqlachemy 对数据库操作
mysql 安装后的各种问题
配置yum 源
flask session
flask-sqlalchemy
flask_数据库中:
用户,权限数据库操作:
记录Flask的点滴:
构建Flask模块开发
&1& Flask-RESTful 是一个 Flask 扩展,它添加了快速构建REST APIs 的支持
3&&& Flask 快速入门:
5.&& 简书:Flask web开发:
7.& Flask 扩展-思城之道:
10.&&Flask 操作mysql:
12.&&Flask 使用案例-mysql:
14.&&Flask 用户登录:
18.&&Flask 中的session问题:
20.&&Flask源码阅读笔记
22.&&Flask 有关session扩展:
24.&&Flask使用小结
26.&&Flask-session扩展:
28.&&这就是传说中的ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上
29.&&Python数据库ORMSQLAlchemy 0.7学习笔记(7) 关系:
31.&&怎么学习一个框架:
34.&&web初学者指南:-PHP
36.&&11款常见的web开发应用程序框架:
38.&&Http:thedefinitive Guide 书籍推荐
39.&&廖雪峰的官方学习网站:
41.&&编写一个简单的web框架
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2946次
排名:千里之外
原创:27篇
转载:14篇
(10)(1)(3)(2)(16)(8)(1)(点击上方蓝字,可快速关注我们)1.简介在python web框架的世界里充满了选择。有Django,Flask,Pyramid,Tornado,Bottle,Diesel,Pecan,Falcon等等的来吸引开发者的注意。作为一个开发者,你想要从中选择一个框架来帮你完成项目,并且能继续做大事情。我们将关注Flask、Pyramid和Django。它们是微框架和商业级web服务的典范。为了让你在这三个中做选择的时候能够更容易,我们会用每个框架来构建相同的应用,然后比较各自的代码,突出它们的优势和弱点。如果你想要代码,可以直接跳到 框架实战 章节或者在Github上下载代码。Flask是一个微框架,主要面向需求简单的小应用。Pyramid和Django都是面向大的应用,但是在扩展性和灵活性上走了不同的路。Pyramid关注灵活性,让开发者选择合适的工具来开发项目。这意味着开发者可以选择数据库,URL结构,模板风格等等。Django的目标是提供web应用开发的一站式解决方案,所以相应的模块也就比较多。Django包含了一个ORM模块,而Pyramid和Flask是让开发者来选择如何存储数据。针对非Django框架的最流行的ORM目前是SQLAlchemy,也有很多其他的选择,比如DynamoDB和MongoDB,亦或是像LevelDB和SQLite这样的简单本地持久化。Pyramid被设计可以使用任何持久层,甚至是还没做好的。2 关于框架Django的一站式解决的思路能让开发者不用在开发之前就在选择应用的基础设施上花费大量时间。Django有模板,表单,路由,认证,基本的数据库管理等等内建功能。与之相反,Pyramid包含路由和验证,但是模板和数据库管理需要第三方库。用Flask和Pyramid来构建应用之前,选择组件的时候会给开发者带来更多的灵活性 ,可能有的应用场景不适合使用一个标准的ORM,或者需要与不同的工作流和模板系统交互。Flask,这三个框架李最年轻的一个,创始与2010年年中。Pyramid框架来源于Pylons项目,在2010年末更名为Pyramid,它最早发布与2005年。Django发布于2006年,就在Pylons项目之后。Pyramid和Django是非常成熟的框架,积累了大量的插件和扩展来满足不同需要。尽管Flask的历史较短,但它能够从以前的框架学到一些东西并且将它的目标设定在了小型项目上。它在一些仅有一两个功能的小型项目上得到了大量应用。比如httpbin这样的项目,简单但非常强大,是一个帮助debug和测试HTTP的库。3 社区Django的社区是最活跃的,在StackOverflow上有80000个相关问题和大量的博客和强大的用户。Flask和Pyramid的社区就没有这么大了,但是它们的社区在邮件列表和IRC里还是挺活跃的。在StackOverflow上只有5000个相关问题,Flask比Django的关注度小15倍。在Github上,它们的stars数相近,Django有11300个,Flask有10900个。这三个框架都是处于BSD衍生的开源许可证书之下。Flask和Django的证书都是3条款BSD,而Pyramid的是RPL,是4条款BSD证书的衍生版。4 入门引导Django和Pyramid都有内建的引导工具。Flask没有,因为Flask的主要受众不是要构建大型MVC应用的。4.1 FlaskFlask的Hello World应用的代码是最简单的,只用在一个Python文件里码7行代码就够了。# from http://flask.pocoo.org/ tutorialfrom flask import Flaskapp = Flask(__name__)@app.route(&/&) # take note of this decorator syntax, it's a common patterndef hello():return &Hello World!&if __name__ == &__main__&:app.run()这就是为什么Flask没有引导工具:因为它根本不需要。从上面的Hello World应用的特点来看,一个没什么Python web开发经验的人就可以很快的上手开始撸代码。对于需要把组件分离开的项目,Flask有blueprints。例如,你可以这样构建你的应用,将与用户有关的功能放在user.py里,把与销售相关的功能放在ecommerce.py里,然后在site.py里引用并添加到你的应用里。我们暂时不会体验这个功能了,它超出了我们的实例应用的需要。4.2 PyramidPyramid的引导工具叫pcreate,它是Pyramid的一部分。之前有一个Paste的工具,不过后来被Pyramid指定的工具链替代了。$ pcreate -s starter hello_pyramid # Just make a Pyramid projectPyramid希望能够做比Flask更大和复杂的应用。因此,它的引导工具会创建一个更大的项目框架。它里面包含一个配置文件,一个例子模板,还有文件能打包你的应用并上传到Python Package Index(PYPI)。hello_pyramid├── CHANGES.txt├── development.ini├── MANIFEST.in├── production.ini├── hello_pyramid│ ├── __init__.py│ ├── static│ │ ├── pyramid-16x16.png│ │ ├── pyramid.png│ │ ├── theme.css│ │ └── theme.min.css│ ├── templates│ │ └── mytemplate.pt│ ├── tests.py│ └── views.py├── README.txt└── setup.py跟别的框架相比,Pyramid的引导工具特别的灵活。它没有被限制在一个默认应用里;pcreate可以使用任何数量的项目模板。包括我们在上面使用starter模板创建出来的,包含SQLAlchemy和ZODB支撑的项目。在PyPi上,可以找到依赖于Google App Engine,jQuery Mobile,Jinja2 templating,modern frontend frameworks等等的模板。4.3 DjangoDjango也有自己的引导工具,它是django-admin的一部分。django-admin startproject hello_djangodjango-admin startapp howdy # make an application within our project我们已经可以看到Django和Pyramid的一些区别。Django把一个项目分成各自独立的应用,而Pyramid和Flask认为一个项目应该是一个包含一些视图和模型的单个应用。也可以在Flask和Pyramid里复制出像Django那样的项目结构,但那不是默认的。hello_django├── hello_django│ ├── __init__.py│ ├── settings.py│ ├── urls.py│ └── wsgi.py├── howdy│ ├── admin.py│ ├── __init__.py│ ├── migrations│ │ └── __init__.py│ ├── models.py│ ├── tests.py│ └── views.py└── manage.py默认情况下,Django只包含空的模型和模板文件,一个新的用户可以看一点例子代码就开始工作。它也能让开发者选择如何分配Django的应用。这个引导工具的弱点是没有引导用户去打包他们的应用,新手往往会忽视这一点。如果一个开发者从未打包过应用,他们会发现在第一次部署的时候会有点乱糟糟的。一些有较大社区的项目,如django-oscar是被打包好的,并且能在PyPi上下载,但是在Github上,一些小的项目往往缺乏统一的打包。5 模板有一个能回复HTTP请求的Python应用是个很好的开始,但是你的用户不会用curl来与你的应用交互。幸运的是,这三个框架都提供了简单的方法能让你向HTML里填充自定义信息,可以让大家领略到你酷炫的前端技术。模板能让你直接向页面中嵌入动态信息,而不用发送AJAX请求。这对于用户体验是有利的,你能一次加载整个页面和它的动态数据。这对于移动端网站是非常重要的,能够节省数秒钟时间。所有的我们使用的模板都依赖上下文提供动态信息,并将其通过模板渲染进HTML。模板的最简单使用场景是很流行的一个例子,给已登录的用户的名字打招呼。也可以使用AJAX来获取动态信息,但需要一个调用来获取用户名信息,这样可能有点费事了,毕竟用模板来实现这么简单。5.1 Django我们这里的使用场景非常简单,假定我们有一个user对象,它有一个fullname的属性,里面包含一个用户的名字。在Python里,我们会这样把当前用户信息传递给模板:def a_view(request):# get the logged in user# ... do more thingsreturn render_to_response(&view.html&,{&user&: cur_user})构成模板上下文非常简单,只需要将一个有Python对象和数据结构的字典传进模板即可。现在,我们需要通过名称将其渲染进页面,以免我们忘了它们是什么。&!-- view.html --&&div class=&top-bar row&&&div class=&col-md-10&&&!-- more top bar things go here --&&/div&{% if user %}&div class=&col-md-2 whoami&&You are logged in as {{ user.fullname }}&/div&{% endif %}&/div&首先,我们看到{% if user %}这样的结构。在Django模板里,{% 是用来一些控制语句的比如循环和条件式。if use 的声明是用来针对如果没有user的情况。匿名用户不应该在页面上方看到“you are logged in as”的字样。在if块里,你可以看到包括名字是被简单的封装在了{{}}里。{{是用来放实际中嵌入模板的值,比如{{ user.fullname }}。模板的另一个常见用法是展示一组东西,比如一个商业网站的存货页面。def browse_shop(request):# get itemsreturn render_to_response(&browse.html&,{&inventory&: all_items})模板里,我们可以使用相同的 {% 来循环出存货数据里的所有项目,并且将其填充到URL和各自页面。{% for widget in inventory %}&li&&a href=&/widget/{{ widget.slug }}/&&{{ widget.displayname }}&/a&&/li&{% endfor %}对于大多数普通的模板任务来说,Django能够轻松实现,非常容易上手。5.2 FlaskFlask默认使用一个受Django启发而发展起来的名为Jinja2的模板,但也可以通过配置来使用其他的语言。一个码农可能会将Django和Jinja模板弄混。事实上,所有上面的Django模板的例子在Jinja2里也是好使的。我们就不重复上面的例子了,我们来看看Jinja2比Django模板的一些更有表现力的特点。Jinja和Django模板都提供一个叫过滤的特性,一个列表可以在被展示前传给一个函数。一个博客如果包含分类的特性,就可以使用过滤来将一个分类下的文章筛选出来。&!-- Django --&&div class=&categories&&Categories: {{ post.categories|join:&, & }}&/div&&!-- now in Jinja --&&div class=&categories&&Categories: {{ post.categories|join(&, &) }}&/div&在Jinja的模板语言里,可以把任何数量的参数传给过滤器,因为Jinja像调用一个Python函数的方式来看待它,用圆括号来封装参数。Django使用冒号来分隔过滤器名和参数,这样就只能传递一个参数了。Jinja和Django的 for 循环很相似。我们来看看它们的区别。在Jinja2, for-else-endfor 结构让你能对一个列表进行迭代,也能处理列表为空的情况。{% for item in inventory %}&div class=&display-item&&{{ item.render() }}&/div&{% else %}&div class=&display-warn&&&h3&No items found&/h3&&p&Try another search, maybe?&/p&&/div&{% endfor %}在Django版本的功能是一样的,只是使用了 for-empty-endfor 这样的结构替换了 for-else-endfor 的结构。{% for item in inventory %}&div class=&display-item&&{{ item.render }}&/div&{% empty %}&div class=&display-warn&&&h3&No items found&/h3&&p&Try another search, maybe?&/p&&/div&{% endfor %}除了上面的语法差别,Jinja2提供更多的执行环境的控制和高级特性。例如,它可以关闭潜在的危险特性来运行不受信任的模板,或者提前编译模板以确保它们有效。5.3 Pyramid跟Flask类似,Pyramid支持很多模板语言(包括Jinja2和Mako),但它有一个默认的模板。Pyramid使用Chameleon,一个ZPT(the Zope Page Template)语言的实现。我们来看一个例子,把用户的名字添加到网站顶端。相应的Python代码有点类似但更加明确,不用调用render_template函数。@view_config(renderer='templates/home.pt')def my_view(request):# do stuff...return {'user': user}但是我们的模板看起来就差别挺大了。ZPT是一个基于XML的模板标准,所以我们使用XSLT类似的声明来管理数据。&div class=&top-bar row&&&div class=&col-md-10&&&!-- more top bar things go here --&&/div&&div tal:condition=&user&tal:content=&string:You are logged in as ${user.fullname}&class=&col-md-2 whoami&&&/div&&/div&Chameleon 有三种不同的模板动作命名空间。TAL(template attribute language)提供基本的条件语句,基本的字符串格式化,根据标记过滤内容。上面的例子只使用了TAL来完成相应工作。对于更加高级的工作,就需要TALES和METAL了。TALES(Template Attribute Language Expression Syntax)提供一些高级的字符串格式化,评估Python表达式,和引入表达式和模板。METAL(Macro Expansion Template Attribute Language)是Chameleon模板里最强大(和最复杂)的部分。Macros是可扩展的,可以被定义得像槽一样,在macro被调用的时候填充上。6. 框架实战对每个框架,我们来看看做一个叫wut4lunch的应用,这是一个社交网络,可以告诉整个英特网这你晚饭吃了什么。就用这个想法启动,是个游戏规则改变者。这个应用会是一个简单的接口,能让用户PO出他们午饭吃了什么,还可以看到别人吃了什么。首页看起来会是这个样子:6.1 用Flask做的应用这个最短的实现,仅需34行Python代码和一个22行的Jinja模板。首先,我们有一些例行公事的任务,比如初始化我们的应用和引入ORM。from flask import Flask# For this example we'll use SQLAlchemy, a popular ORM that supports a# variety of backends including SQLite, MySQL, and PostgreSQLfrom flask.ext.sqlalchemy import SQLAlchemyapp = Flask(__name__)# We'll just use SQLite here so we don't need an external databaseapp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'db = SQLAlchemy(app)首先,我们来看我们的模型,跟其他两个例子里的会差不多。class Lunch(db.Model):&&&A single lunch&程序员的那些事(iProgrammer) 
 文章为作者独立观点,不代表WtouTiao文章网立场
的最新文章
救火队型的程序员希望能解答你对 Python 编码的困惑这篇文章推荐了包括技术、设计和极客相关的热门公众号。国外培训机构 FreeCodeCamp 今年 3 月做了一次「新程序员问卷调查」,15600 多人参与并分享了他们从事的职业和学习编程的方法。FCC 公开了他们的调查数据,本文将按照工作偏好分类,并寻找之间的不同。趣图:要吃饭的时候,产品又来说要改需求了SELECT语句的性能调优有时是一个非常耗时的任务,在我看来它遵循帕累托原则。20%的努力很可能会给你带来80%的性能提升,而为了获得另外20%的性能提升你可能需要花费80%的时间。Cecily Carver
是多伦多的一位程序媛,和 Jennie Faber 一起创办了一个游戏制作工作室。她喜欢歌剧、舞蹈和弹钢琴。Cecily 在这篇文章分享她在编程道路上的所感所想,给出很多值得思考的编程箴言以及一些思想误区三张漫画:文科女理想中的理科男、 理科女理想中的理科男、理科男理想中的文科女大四毕业前夕,计算机学院,正在四处求职的小灰碰到了同系的学霸大黄……他们就像永不停歇的发动机,追求用技术手段提高公司效率。漫画:程序员正在修复问题中大四毕业前夕,计算机学院的小灰又一次顶着炎炎烈日,去某IT公司面试研发工程师岗位……距离2016年度编程语言的公布只剩3个月了,谁将夺得桂冠?与去年同期相比,2016年只有Go语言和Groovy语言的增长率超过了1%。这篇博文源自我在twitter上发的一条推。这条推被很多开发者、系统管理员和数据库管理员转发,到我写这篇博文的时候已经转发了超过170次,哇哦,这可是我个人最佳成绩。很明显,这条推在很多开发者中产生了共鸣。趣图:你用 Tab 还是 Space ?2012年,国外程序员 Daniel Greenfeld 在 Twitter 发了一条推(见下图):“开发人员每天应当有 4-6 小时的无中断时间。每次 3-5 分钟的中断,其成本远超过你的想象。”趣图:程序员最感到无助的时刻对于非教育工作者们来说,讨论在学校里什么应该教和什么不应该教是非常棘手的。我自己的校园时光只是一段关于荷尔蒙、焦虑与恼人作业的模糊记忆。然而我在这里,想说一说。我们中国有一句关于农业生产的古老谚语:瑞雪兆丰年。就是说,如果前一年冬天下雪很大很多,那么第二年庄稼丰收的可能性比较大。小程序员妈妈的逆袭过去的几个月里发生的几件事情,让给政府做软件开发的人感受到压力的陡增,从奥巴马的医保网站饱受诟病到美国退伍军人事务部官方网站的预约系统从1985年起就没有更新过,这些事情让我回忆起曾经作为政府程序员的经历趣图:客户说他遇到了一个要蛇才能运行的程序Github 上最具影响力的组织/机构有哪些?gh-impact 可以对此进行评估。作为一名IT从业者,时常感觉自己被“歧视”:与人初识只要说自己是程序员,对方总会问一句“加班狗?” ……没错,我们是就那群“下午三点吃饭,凌晨三点睡觉”的程序员,也是那群面试时敢回答老板“不接受加班”就别想找到工作的人。如何找一个好记的高强度密码?最近我接手了一个新的Web项目,不过老实说我已经好久没碰过这方面的代码了。听说前端的技术栈已经发生了极大的变革,不知道你现在是不是仍然处于最前沿的开发者阵列?趣图:游戏开发者是如何设计角色的假期回来第一天上班,领导找我说,你的人都划入各个事业部,管理权也都放在各事业部,于是我就成了一个光杆司令,后续未知。老板:小五,做个类似于微X支付功能,很简单的,要做多久?
我:……办事效率、雄心壮志、截止时间和时间之间的关系程序员工作中有两件事,一是写 Bug,另外就是调 Bug。我大概知道为啥程序员被称为「码农」了(点击上方公众号,可快速关注)来源:伯乐在线链接:/5886/趣图:高数只有 2 种题型国庆充电,程序员看这些号学习今天是国庆假期第一天,不知道有多少童鞋和「程序员的那些事」主页君一样,觉得景点人太多,不如在家休息或学习,其他非高峰时期再出去玩。趣图:请相信我,我可是工程师啊主页君今天就推荐一大波可以女朋友一起玩,不仅能够提升编程能力,也不会冷落女朋友哈。这是一个艰难时刻,你选哪个这篇文章推荐了包括技术、设计和极客相关的热门公众号。大家都在抱怨同事的代码写的烂,前同事遗留下来的代码bug多…… 那问题来了,写这些烂代码的人都去哪了? 好奇怪哎!理想的产品开发流程 vs 实际的开发流程这篇文章推荐了包括技术、设计和极客相关的热门公众号。「程序员的那些事」主页君相信大家都有类似的经历。遇到 Bug/问题被卡住了,拉个人过来,和他 blablabla 讲了一通,很多时候中途你就找到了解决办法。漫画:IT 人的遗言讨论:我会几种编程语言,但没有一个精通本文收录的文章来自 10 个热门的技术类微信公众号。我们从每个公号中选出了 2016 年 8 月最热门的 10+ 篇技术文章,共 100 篇精华。我经常看有人发帖问关于项目点子的事,也看到了很多回帖,我自己也回了一些常见的项目。不过我觉得只列出三两个是远远不够的,因此就收集并这个项目列表,大家要找简单的编程项目学习练手的话,可以收藏并扩散本文。趣图:一行一行找 Bug讨论:女生搞开发能干一辈子吗?有没有发展前景啊?iProgrammer最有影响力的程序员自媒体,关注程序员相关话题:IT技术、IT职场、在线课程、学习资源等。热门文章最新文章iProgrammer最有影响力的程序员自媒体,关注程序员相关话题:IT技术、IT职场、在线课程、学习资源等。flask中flask_sqlalchemy多对多关系疑问_问答_ThinkSAAS
flask中flask_sqlalchemy多对多关系疑问
flask中flask_sqlalchemy多对多关系疑问
我在models里面创建多对多关系的时候,有一个可以创建成功,另外一个创建不成功,不知道问题出在哪儿,代码如下:
user_db = db.table('user_db',db.Model.metadata,
db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
db.Column('db_id', db.Integer, db.ForeignKey('dbs.id'))
user_pro = db.Table('user_pro', db.Model.metadata,
db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
db.Column('pro_id', db.Integer, db.ForeignKey('pros.id'))
class users(UserMixin,db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
name = db.Column(db.String(64), unique=True)
password_hash = db.Column(db.String(128))
useremail = db.Column(db.String(64))
dbs = db.relationship('dbs', secondary=user_db, backref=db.backref('users', lazy='dynamic'))
pros = db.relationship('pros', secondary=user_pro, backref=db.backref('users', lazy='dynamic'))
role = db.Column(db.String(64),default='1')
status = db.Column(db.Integer,default=1)
createtime = db.Column(db.DateTime)
def password(self):
raise AttributeError('password is not a readable attribute')
@password.setter
def password(self, password):
self.password_hash = generate_password_hash(password)
def verify_password(self, password):
return check_password_hash(self.password_hash, password)
def __repr__(self):
return '&user %r&' % self.username
class pros(db.Model):
__tablename__ = 'pros'
id = db.Column(db.Integer, primary_key=True)
proname = db.Column(db.String(64), unique=True, index=True)
prodomain = db.Column(db.String(64), unique=True)
protype = db.Column(db.String(64))
propath = db.Column(db.String(64))
tomcatpath = db.Column(db.String(64))
svnurl = db.Column(db.String(64))
svnuser = db.Column(db.String(64))
svnpass = db.Column(db.String(64))
svnver = db.Column(db.String(64))
svnoldver = db.Column(db.String(64))
host_ip = db.Column(db.String(64),db.ForeignKey('hosts.hostip',ondelete='CASCADE'))
def __repr__(self):
return '&Pro %r&' % self.proname
class dbs(db.Model):
__tablename__ = 'dbs'
id = db.Column(db.Integer, primary_key=True)
proname = db.Column(db.String(64), unique=True, index=True)
dburl = db.Column(db.String(64))
dbname = db.Column(db.String(64))
dbuser = db.Column(db.String(64))
dbpass = db.Column(db.String(64))
def __repr__(self):
return '&db %r&' %self.proname
运行报错如下:
Yan-Pro:opsmanager yan$ python manage.py shell
Traceback (most recent call last):
File"manage.py", line 4, in &module&
from app.models import users, dbs, pros,hosts
File"/Users/yan/开发项目/opsmanager/app/models.py", line 8, in &module&
db.Column('db_id', db.Integer, db.ForeignKey('dbs.id'))
File"&string&", line 2, in table
File"/Library/Python/2.7/site-packages/sqlalchemy/sql/selectable.py", line 1334, in __init__
self.append_column(c)
File"/Library/Python/2.7/site-packages/sqlalchemy/sql/selectable.py", line 1347, in append_column
self._columns[c.key] = c
AttributeError: 'MetaData' object has no attribute 'key'
而且如果我把
user_db = db.table('user_db',db.Model.metadata,
db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
db.Column('db_id', db.Integer, db.ForeignKey('dbs.id'))
改为下面这个样子(去掉db.Model.metadata,)
user_db = db.table('user_db',
db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
db.Column('db_id', db.Integer, db.ForeignKey('dbs.id'))
没有报错,但是创建数据之后,没有user_db这张表
支付网关支持即可,不需要特别规避。例如支付宝合并交易支付接口。
事实上你将创建一个父订单,该订单有1+个子订单,在支付网关支持的情况下付款方仅需一次付款,但是每个子订单都会得到一个独立的交易号,只有这样某个子订单发生问题的时候可以单独退款而不影响其它子订单。
$urls=['','',''];
$post_data=['aa'=&'bb'];
$resp=curl($urls,$post_data);
print_r($resp);
首先 这只是个函数
其次 怎么用代码注释里写的很清楚了,
PHP CURL 多线程 GET/POST
Email:/QQ:
curl(array('url?get=data','url'),array('','post_data'));
在用,如果用要类的话
snoopy 不是通过curl来获取的
[requests for php]()
多线程的curl推荐这个
多线程curl推荐
两个点,第一个是$str不用空格分开,第二个是生成随机index的时候,应该是-1,不是+1
像这种取数组中某个随机值的时候,index可以用array_rand()函数来生成
$fontFace='aa.ttf';
$str="大闸是中国主导品牌亦行业协会重点推荐家集养殖与销售";
$strDb=str_split($str,3);
for($i=0;$i&4;$i++){
$fontColor=imagecolorallocate($img,mt_rand(0,120),mt_rand(0,120),mt_rand(0,120));
$index=array_rand($strDb);
$cn=$strDb[$index];
$captcha.=$
$x=($i*120/4)+mt_rand(5,10);
$y=mt_rand(25,45);
imagettftext($img,15,mt_rand(-30,60),$x,$y,$fontColor,$fontFace,$cn);
用mb扩展的函数处理字符串,解决编码问题,另外空格有啥用么?
添加你想要问的问题
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信}

我要回帖

更多关于 flask sqlalchemy sql 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信