在本文中,我们将为您详细介绍与Flask服务器同时运行while循环的相关知识,并且为您解答关于flask服务器部署hello的疑问,此外,我们还会提供一些关于C语言循环结构(while循环,for循
在本文中,我们将为您详细介绍与Flask服务器同时运行while循环的相关知识,并且为您解答关于flask服务器部署 hello的疑问,此外,我们还会提供一些关于C语言循环结构(while循环,for循环,do…while循环)、do while循环,C语言do while循环详解、flask 设置https请求 访问flask服务器、for循环vs while循环与foreach循环PHP的有用信息。
本文目录一览:- 与Flask服务器同时运行while循环(flask服务器部署 hello)
- C语言循环结构(while循环,for循环,do…while循环)
- do while循环,C语言do while循环详解
- flask 设置https请求 访问flask服务器
- for循环vs while循环与foreach循环PHP
与Flask服务器同时运行while循环(flask服务器部署 hello)
我正在使用python更新一些LED。我一直在这样做:
from LEDs import *myLEDs = LEDs()done = Falsewhile not done: myLEDs.iterate()
我想用Flask充当一些我可以在我的浏览器中运行的ReactJS前端(以更改当前模式等)与Python中的LED控制代码之间的桥梁。
我的Flask工作正常,可以处理HTTP请求,等等。我想知道如何设置myLEDs.iterate()
我的flask应用程序同时连续运行(或快速运行),同时仍然能够相互通信,就像这样:
myLEDs = LEDs()@app.route(''/changePattern'',methods=[''POST''])def changePattern(): n = request.json[''num''] myLEDs.setPattern(n) return jsonify(**locals())if __name__ == ''__main__'': app.debug = True myLEDs.setToFrequentlyIterateAndStillTalkToFlask() app.run()
我遇到了celery
,这似乎可以解决问题,但对于我的问题有多简单,似乎也有些过头了。
使用Flask overkill只是为了让UI管理我的python后端代码吗?是否有比Celery更简单的库可用于在后台运行某些内容?
答案1
小编典典使用多进程在Flask HTTP请求的不同进程中运行循环:
import timefrom flask import Flask, jsonifyfrom multiprocessing import Process, Valueapp = Flask(__name__)tasks = [ { ''id'': 1, ''title'': u''Buy groceries'', ''description'': u''Milk, Cheese, Pizza, Fruit, Tylenol'', ''done'': False }, { ''id'': 2, ''title'': u''Learn Python'', ''description'': u''Need to find a good Python tutorial on the web'', ''done'': False }]@app.route(''/todo/api/v1.0/tasks'', methods=[''GET''])def get_tasks(): return jsonify({''tasks'': tasks})def record_loop(loop_on): while True: if loop_on.value == True: print("loop running") time.sleep(1)if __name__ == "__main__": recording_on = Value(''b'', True) p = Process(target=record_loop, args=(recording_on,)) p.start() app.run(debug=True, use_reloader=False) p.join()
任务部分来自这里,来自我的多处理代码。
注意“ use_reloader = False”部分。这是避免两次运行循环所必需的。由于这个原因,请看这里
可以通过使用以下命令启动服务器来测试功能
python <your_name_for_the example>.py
并打电话
curl -i http://localhost:5000/todo/api/v1.0/tasks
C语言循环结构(while循环,for循环,do…while循环)
使用循环可以多次重复地执行多条语句,这里的“多条语句”称为循环体。在C语言中,可以使用三种循环,分别是:while、do...while和for。在这些语句中,循环体被重复执行的次数由循环条件控制,称为控制表达式(controlling expression)。这是一个标量类型的表达式,也就是说,它属于一个算术表达式或指针表达式。如果控制表达式的值不等于 0,循环条件为 true,反之,循环条件为 false。
语句 break 和 continue 用于在一次循环还未执行完时,跳转出循环或返回到循环头部。
while 循环
只要控制表达式为 true,while 循环就会反复地执行语句:while (表达式)语句
while 表达式是顶部驱动(top-driven)的循环:先计算循环条件(也就是控制表达式)。如果为 true,就执行循环体,然后再次计算控制表达式。如果控制表达式为 false,程序跳过循环体,而去执行循环体后面的语句。
从语法上讲,循环体只有一条语句组成。如果需要执行多条语句时,可以使用语句块把它们组合在一起。例 1 展示了一个简单的 while 循环,从控制台读入多个浮点数,并把它们累加。
例 1 展示了一个简单的 while 循环,从控制台读入多个浮点数,并把它们累加。
【例1】一个 while 循环
/* 从键盘输入数字,然后输出它们的平均值 * -------------------------------------- */ #include <stdio.h> int main() { double x = 0.0,sum = 0.0; int count = 0; printf( "\t--- Calculate Averages ---\n" ); printf( "\nEnter some numbers:\n" "(Type a letter to end your input)\n" ); while ( scanf( "%lf",&x ) == 1 ) { sum += x; ++count; } if ( count == 0 ) printf( "No input data!\n" ); else printf( "The average of your numbers is %.2f\n",sum/count ); return 0; }
在例 1 中,只要用户输入一个小数,下面的控制表达式即为 true:
scanf( "%lf",&x ) == 1
然而,只要函数 scanf()无法将字符串输入转换成浮点数(例如,当用户键入字母 q 时),则 scanf()返回值 0(如果是遇到输入流的尾端或发生错误时,则返回值 -1,表示 EOF)。这时,循环条件为 false,程序将会跳出循环,继续执行循环体后面的 if 语句。
for 循环
和 while 一样,for 循环也是一个顶部驱动的循环,但是它包含了更多的循环逻辑,如下所示:
for ([表达式1];[表达式2];[表达式3])
语句
在一个典型的 for 循环中,在循环体顶部,下述三个动作需要执行:
(1) 表达式 1:初始化
只计算一次。在计算控制表达式之前,先计算一次表达式 1,以进行必要的初始化,后面不再计算它。
(2) 表达式 2:控制表达式
每轮循环前都要计算控制表达式,以判断是否需要继续本轮循环。当控制表达式的结果为 false,结束循环。
(3) 表达式 3:调节器
调节器(例如计数器自增)在每轮循环结束后且表达式 2 计算前执行。即,在运行了调节器后,执行表达式 2,以进行判断。
例 2 展示了使用一个 for 循环初始化数组内每个元素的过程。
【例2】用 for 循环初始化数组
#define ARR_LENGTH 1000 /* ... */ long arr[ARR_LENGTH]; int i; for ( i = 0; i < ARR_LENGTH; ++i ) arr[i] = 2*i;
for 循环头部中的三个表达式可以省略一个或多个。这意味着 for 循环头部最短的形式是:
for ( ; ; )
如果没有控制表达式,则表示循环条件始终是 true,也就是说,这定义了一个死循环。
下面所示的 for 循环,既没有初始化表达式,也没有调节器表达式,它与 while(表达式)语句含义是等效的:
for ( ;表达式; )
事实上,每个 for 循环都可以被改写成 while 循环,反之亦然。例如,例 2 的 for 循环可完全等效为下面的 while 循环:
i = 0; // 初始化计数器 while ( i < ARR_LENGTH ) // 循环条件 { arr[i] = 2*i; ++i; // 递增计数器 }
一般来说,当循环内有计数器或索引变量需要被初始化,并且在每次循环时需要调整它们的值时,最好使用 for 循环,而不是 while 循环。
在ANSI C99中,也可以使用声明来替代表达式1。在这种情况下,被声明变量的作用域被限制在 for 循环范围内。例如:
for ( int i = 0; i < ARR_LENGTH; ++i ) arr[i] = 2*i;
变量 i 被声明在该 for 循环中(与例 2 不同)for 循环结束之后,变量 i 将不会再存在。
逗号运算符常常被用在 for 循环头部,以在表达式 1 中实现多个初始化操作,或者在表达式 3 对每个变量做调整操作。例如,函数 strReverse()使用两个索引变量以保存字符串中字符的次序:
void strReverse( char* str) { char ch; for ( size_t i = 0,j = strlen(str)-1; i < j; ++i,--j ) ch = str[i],str[i] = str[j],str[j] = ch; }
借助于逗号运算符,可以在只允许出现一个表达式的地方,计算多个表达式。
do...while 循环
do...while 循环是一种底部驱动的循环:do 语句 while (表达式);
在控制表达式被第一次计算之前,循环体语句会首先被执行一次。与 while 和 for 循环不同,do...while 循环会确保循环体语句至少执行一次。如果控制表达式的值为 true,那么另一次循环就会继续;如果是 false,则循环结束。
在例 3 中,读入与执行命令的函数至少会被调用一次。当使用者离开菜单系统,函数 getCommand()将返回常量 END 的值。
【例3】do···while
// 读入和执行所选的菜单命令 // -------------------------------------------- int getCommand( void ); void performCommand( int cmd ); #define END 0 /* ... */ do { int command = getCommand(); // 询问菜单系统 performCommand( command ); // 执行所选的菜单命令 } while ( command != END );
例 4 展示了标准库函数 strcpy()的一个版本,循环体仅为一条简单的语句,而不是一个语句块。因为在循环体执行之后才计算循环条件,所以字符串终止符'\0'也会被复制。
【例4】函数 strcpy()使用 do...while
// 将字符串2复制到字符串1 // ---------------------------- char *strcpy( char* restrict s1,const char* restrict s2 ) { int i = 0; do s1[i] = s2[i]; // 循环体:复制每一个字符 while ( s2[i++] != '\0' ); // 如果刚刚复制的是'\0',则结束循环 return s1; }
do while循环,C语言do while循环详解
do…while 循环不经常使用,其主要用于人机交互。它的格式是:
do
{
语句;
}
while (表达式);
do…while 和 while 的执行过程非常相似,唯一的区别是:“do…while 是先执行一次循环体,然后再判别表达式”。当表达式为“真”时,返回重新执行循环体,如此反复,直到表达式为“假”为止,此时循环结束。
现在问一个问题:你认为 while 和 do…while 是否等价?它们是否可以相互转换?我们前面讲,while 和 for 是完全等价的,它们是可以相互转换的。那 do…while 和 while、for 等价吗?它们可以相互转换吗?
答案是“不能”。原因十分简单,while 循环体内部不一定会执行,当表达式一开始就为假的时候它就不会执行。但 do…while 不管表达式开始为真还是为假,循环体内部都会先执行一次。
下面举个例子,设计一个计算“一元二次方程”的程序。运行的结果是让你输入三个数,然后计算结果,完了之后还会问你:“您想继续吗?”想继续的话可以再输入三个数,不想继续,输入“N”就退出。下面就来写这个程序:
# include <stdio.h> # include <math.h> int main(void) { float a,b,c; //定义一元二次方程的三个系数 char k; //用于后面判断是否要继续输入 double delta,x1,x2; /*delta用来存储b*b - 4*a*c的值;x1和x2的值分别为方程的解*/ do { //输入一元二次方程的三个系数a、b、c printf("请输入一元二次方程的三个系数,用回车分隔:\n"); printf("a = "); scanf("%f",&a); while(getchar() != '\n'); /*容错处理,scanf后面都加上这一句,作用是清空输入缓冲区,以防用户乱输入*/ printf("b = "); scanf("%f",&b); while(getchar() != '\n'); printf("c = "); scanf("%f",&c); while(getchar() != '\n'); delta = b*b - 4*a*c; //判断delta的值是大于零,等于零,还是小于零 if (delta > 0) { x1 = (-b +sqrt(delta)) / (2*a); x2 = (-b -sqrt(delta)) / (2*a); printf("有两个解,x1 = %f,x2 = %f\n",x2); } else if (0 == delta) { x1 = x2 = (-b) / (2*a); printf("有唯一解,x1 = x2 = %f\n",x1); } else { printf("无实数解\n"); } //询问是否想继续输入 printf("您想继续吗,Y想,N不想:"); scanf("%c",&k); //输入Y或者N,表示“想”或“不想” while(getchar() != '\n'); } while ('Y' == k); return 0; }输出结果是:
请输入一元二次方程的三个系数,用回车分隔:
a = 1
b = 5
c = 6
有两个解,x1 = -2.000000,x2 = -3.000000
您想继续吗,N不想:Y
请输入一元二次方程的三个系数,用回车分隔:
a = 2
b = 3
c = 4无实数解
您想继续吗,N不想:N
程序中,“while(getchar()!='\n');”是 getchar() 的高级用法,作用是彻底地清空输入缓冲区。getchar() 每次从缓冲区中取出一个字符,只要取出的字符不是回车就一直取,这样就将缓冲区中所有的垃圾字符都取出来了。
此外,do…while(1) 和 while(1) 虽然不等价,但是在功能上可以互换,因为反正是无限制循环,所以不管是先执行一次循环体再判断,还是先判断再执行循环体结果都一样。但如果 while 后面的表达式不是 1,那就不能相互替换。大家看上面这个程序,do…while 中不是 do…while(1),而是 do…while('Y'==k),即只有 'Y'==k 才执行循环,但只有先执行一次循环体才知道变量 k 中存储的是什么,才能执行最后的 while('Y'==k),这样就无法用 while(1) 来替代。因此 do…while 一般的使用场合为 while 后的表达式不为 1。
这就是人机交互,用户与机器里面的一个程序进行相互交流:机器给一个提示,用户输入一个值,然后机器再将结果返回给用户,然后再给你一个提示……就这样一步一步执行。do…while 主要用于人机交互,在其他地方都用得很少。
flask 设置https请求 访问flask服务器
学习过程中想要学教程中一样,做个假的微信公众号推送,不过去了微信开发文档怎么一直说需要https的请求(教学中没有说需要https,一直是http)
但是我的服务器只能使用http请求访问,如果硬是要在url中添加https 则会显示没有这个网站
于是我就想法让https请求也能请求到我的服务器域名上
我的域名是在阿里云买的,所以我就直接在阿里云上购买了证书,购买使用的是免费的1年证书
流程如下
购买之后显示,但是还没有绑定域名,所以需要申请证书绑定这个域名
点击申请,根据弹出的页面进行一个填写 我买的域名是 www.zengyimin.xyz
根据下一步不断填写信息,等待审核,出现如下画面表示绑定域名成功
点击下载 ,会下载一个压缩包
包名是绑定的域名
包中含有pem和key 证书和密匙,解压
接下来在放置 nginx 的服务器上进行操作 ,进入nginx的配置目录 (我是ubuntu)
cd /etc/nginx
该目录新建一个文件夹 放置证书和key
mkdir cert
将解压的文件上传至该文件夹
进入nginx的配置文件 (我的nginx版本不同,有些操作和你们不同,以下我的个人讲解你们看看就好 )
其中nginx.conf 是全部的配置文件集合, sites-acailable 和 siter-enabled 文件夹含有一些服务器的配置
如果你在sites中配置完成,启动nginx 时 nginx会带上nginx.conf 配置文件启动,配置文件会include导入 sites 中的配置文文件
同时sites 中的文件貌似是镜像文件? 更改一个另一个也会变
我的配置文件 进入 sites-enabled vim更改配置文件 default
这是我原本 http 80 端口的server服务配置 http不需要证书,所以不需要证书设置
https 443 的配置 ,在该文件中添加一个 server 服务
重启ngxin
service nginx restart
可以尝试在url中使用https请求nginx绑定的域名(我是一台机,其实就是flask服务器绑定的域名)了
免费证书会在google浏览器访问时提示有问题,所以需要证书还是购买有服务的比较好
http://www.zengyimin.xyz/api/v1.0/log
https://www.zengyimin.xyz/api/v1.0/log
都是一样的访问,不过http和https的请求都能请求,区别也不大...
除非用户输入http请求会自动跳转https的请求
所以我个人的最终方案
# 所有的往http80端口的请求都会被 rewrite 进行一个拦截 重定向 将http 请求改为https
server {
listen 80;
server_name www.zengyimin.xyz;
rewrite ^(.*)$ https://$host$1 permanent; # <----------------- 重点 这是重定向
location / {
index index.html index.htm;
}
}
# 这是新增的 https 的server
server {
listen 443;
server_name www.zengyimin.xyz;
ssl on;
root html;
index index.html index.htm;
ssl_certificate cert/2568867_www.zengyimin.xyz.pem; # 证书
ssl_certificate_key cert/2568867_www.zengyimin.xyz.key; # 密匙
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:5001; # https请求转发到服务器ip地址
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
最终所有前往nginx服务器的请求都会被重定向到https请求
https://help.aliyun.com/document_detail/98728.html?spm=5176.2020520163.0.0.7bb9d5OKd5OKj5
https://lufficc.com/blog/configure-nginx-as-a-web-server
for循环vs while循环与foreach循环PHP
哪一个更好的表现?
>选择循环的标准是什么?
>当我们循环在另一个循环中时应该使用哪个?
我被卡住的代码,想知道要使用哪个循环.
for($i=0;$i<count($all);$i++) { //do some tasks here for($j=0;$j<count($rows);$j++) { //do some other tasks here } }
很明显,我可以使用while编写上述代码.希望有人能帮助我找出应该使用哪个循环.
which one is better for performance?
没关系
what’s the criteria to select a loop?
如果您只需要遍历对象或数组的所有元素,请使用foreach.您需要的案例包括
>当你明确地需要用数字索引做事情时,例如:
>当您需要在迭代中使用上一个或下一个元素
>当您需要在迭代期间更改计数器
foreach更方便,因为它不需要您设置计数,并且可以通过任何类型的成员工作 – 无论是对象属性还是关联数组元素(不能捕获).通常最好的可读性.
which should be used when we loop inside another loop?
两者都很好在您的演示案例中,foreach是最简单的方式.
我们今天的关于与Flask服务器同时运行while循环和flask服务器部署 hello的分享已经告一段落,感谢您的关注,如果您想了解更多关于C语言循环结构(while循环,for循环,do…while循环)、do while循环,C语言do while循环详解、flask 设置https请求 访问flask服务器、for循环vs while循环与foreach循环PHP的相关信息,请在本站查询。
本文标签: