爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 19038|回复: 10

[混合编程] Flask服务器应用开发初体验

[复制链接]

新浪微博达人勋

发表于 2020-3-21 19:04:29 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 15195775117 于 2020-10-22 17:15 编辑

--------------前言--------------

信息时代,很多东西都搬到了网页上,不仅是图片、文字这些“数据”,像PS、格式转换等工具都有网页版,所以,不懂web是落伍的。
就目前我的工作,想要进一步发展,势必需要调用地图接口、某些数据网站接口......通过很多web操作,使我的工作更快更高更强。
由于我只是想用网上的资源,辅助自己的专业性工作,不是要做web全栈工程师,所以我选的web开发框架必须是小而精、适合一个人开发的,所以我选择了FLASK
之前由于对web一无所知,看书时一头雾水,于是我去年年底又花了几个月突击了下前端(HTML+CSS+JS),
我买的前端的书是本很厚的大书,看着很唬人,但很快我就发现其中绝大部分我都不需要,书上大部分都在讲怎么美化连接、美化表单、美化表格、美化图片......尽是些没用的。
所以没过多久,我就把书过差不多了,简单的了解了下JS的语法,顺便写了几个大幅简化工作的JS脚本。
之后我发现我是时候学习下后端了,于是从上周开始看FLASK的书,照葫芦画瓢,也应该没什么问题,唯一值得担心的是服务器网络安全的问题,不过这是后话了。
--------------案例--------------


Flask初始化
web服务器使用WSGI,接收客户端的所有请求,交给Flask类的对象处理。


新建对象脚本:
from flask import Flask
app=Flask(__name__)


Flask类的构造函数只有一个必须指定的参数,是“应用主模块或包”的名称。大多数应用中,__name__就是所需的值。该参数确定应用的位置,进而找到应用中其他文件的位置。
客户端(例如浏览器)把请求发送给web服务器,服务器再把请求发送给Flask应用实例,应用实例需要知道对每个URL的请求运行哪些代码,所以保存了一个[URL-python函数的映射关系,处理该关系的程序叫做“路由”。定义路由的最简便方式是使用app.route装饰器。装饰器的惯常用法是:把函数注册为事件处理程序。


@app.route(/)
def index():
return ‘<h1>Hello</h1>’
以上代码,声明了路由,使用app.route装饰器注册视图函数index(),把index()函数注册为应用根地址的处理程序,
index()是处理入站请求的函数,叫视图函数。即,如果应用部署在域名www.example.com的服务器上,浏览器访问该网址后会触发index(),该函数的返回值称为“响应”,客户端会收到。

第一个运行案例:
写个脚本,内容为:


from flask import Flask
app=Flask(__name__)
@app.route('/')
def index():
    return '<h1>第一个Flask服务端应用成功!</h1>'
#启动应用,启动后一直运行,停止按Ctrl+C(matlab一样)
app.run()


(启动方式也可以在命令行中执行:先把以上py脚本目录设置为当前目录,然后键入:set FLASK_APP=flasky.py,最后键入flask run)


应用启动后,在浏览器中输入:http://127.0.0.1:5000/   或者:http://localhost:5000/
就出现了响应:
360截图20200321181424155.jpg
如果地址中有的部分尚未绑定处理函数,就会出错:

360截图20200321181913178.jpg

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2020-3-21 19:42:44 | 显示全部楼层
本帖最后由 15195775117 于 2020-10-22 17:10 编辑

-----------地址中的静态部分和动态部分----------
百度静态图片的地址:
http://api.map.baidu.com/staticimage/v2?ak=E4805d16520de693a3fe707cdc962045&mcode=666666¢er=116.403874,39.914888&width=300&height=200&zoom=11其中“http://api.map.baidu.com/”是静态部分,其余ak值、经纬度、长宽、放大级别都是动态部分。匹配了静态部分的URL会映射了路由上,动态部分会作为参数传入装饰器匹配的函数中处理


-----------实操案例-----------
from flask import Flask
app=Flask(__name__)
@app.route('/user/<x>')
def index(x):
    if x == str(666):        
        return '<h1>六六大顺</h1>'
   if x == str(888):
        return '<h1>888,一路发</h1>'
#启动服务器应用
app.run()
结果:
360截图20200321193201204.jpg 360截图20200321193136564.jpg










密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-3-21 19:50:42 | 显示全部楼层
本帖最后由 15195775117 于 2020-10-22 17:10 编辑

以上案例中,动态部分的数据类型可以设置:

from flask import Flask
app=Flask(__name__)
@app.route('/user/<int:x>')
def index(x):
    if x == 666:#这里就可以直接写数字了,不用转为字符串
        return '<h1>六六大顺</h1>'
    if x == 888:
        return '<h1>888,一路发</h1>'
#启动服务器应用
app.run()


密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-3-21 20:09:44 | 显示全部楼层
本帖最后由 15195775117 于 2020-10-22 17:10 编辑

这种对动态部分做不同处理的叫动态路由

from flask import Flask
app=Flask(__name__)
#访问主页的响应
@app.route('/')
def index():
    return '<h1>欢迎访问!</h1>'
#访问主页下666和888的响应:
@app.route('/user/<int:x>')
def f(x):
    if x == 666:
        return '<h1>六六大顺</h1>'
    if x == 888:
        return '<h1>888,一路发</h1>'
#启动服务器应用
app.run()

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-3-21 20:51:07 | 显示全部楼层
本帖最后由 15195775117 于 2020-10-22 17:07 编辑

----------调试模式----------
app.run(debug=True)
应用以调试模式运行,可以支持应用在运行时修改代码功能,
比如出现了某个错误,这时报错会直接出现在网页上,我们找到并修改bug代码,保存脚本后,服务器会自动重启使代码生效,免去了手动开关服务器的麻烦。

注意事项:
万不可在【生产服务器】(正式对外服务的)上启用调试模式,客户端可通过调试器请求执行远程代码,攻击服务器。
非开不可,可设置PIN码(也并不是太保险)。

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-3-22 11:09:04 | 显示全部楼层
本帖最后由 15195775117 于 2020-10-22 17:11 编辑

----------内网IP与外网IP----------
以上的应用都只能在本地浏览器访问,外网访问是不行的。
把《Flask Web开发》一书通篇翻一遍,好像没说怎么通过外网访问Flask应用的。
我上知乎查了下,是这么个情况:
我们PC机的IP都是内网的,即只有局域网内可以访问;
获得外网IP的一个方式是,从云服务器商(例如阿里云)那里租一台服务器,就会获得一个外网IP,这样就可以在互联网上访问了。
了解了这个情况,我就安心了,现在继续把书啃下来,后面再考虑外网部署的事。

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-3-22 23:03:03 | 显示全部楼层
本帖最后由 15195775117 于 2020-10-22 17:11 编辑

----------“上下文”----------

FLASK从客户端接收请求后,要让“视图函数”访问“请求对象request”。
request封装了客户端发送的HTTP请求。

“上下文”的诞生:
视图函数访问request的方式之一是:将其作为参数传入视图函数,这存在弊端:应用中每个视图函数都多出一个参数,如果视图函数在处理请求时还访问其他对象,情况会变得复杂。为尽量简化视图函数的参数,Flask使用“上下文”临时把某些对象变为全局可访问。

flask中有2种“上下文”:“应用上下文”“请求上下文”。

“应用上下文”的变量:
1、current_app------当前应用的应用实例,
2、g------处理请求时,用作临时存储的对象,每次请求都会重置这个变量

“请求上下文”的变量:
1、request
2、session------“用户会话”,值是一个字典,存储请求之间需要记住的值

Flask在分派请求之前,激活/推送“应用和请求上下文”,请求处理完成后,将其删除。

“应用上下文”被推送后,可在当前线程中使用current_app和g变量。
“请求上下文”被推送后,可使用request和session变量。

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-3-22 23:05:47 | 显示全部楼层
本帖最后由 15195775117 于 2020-10-22 17:12 编辑

----------请求的分派----------
应用接收到客户端的请求后,flask在应用的“URL映射”中查找请求的URL,“URL映射”是url和视图函数之间的对应关系,然后找到处理该请求的视图函数。
flask使用app.route装饰器构建映射。

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-3-22 23:07:53 | 显示全部楼层
本帖最后由 15195775117 于 2020-10-22 17:12 编辑

----------request常用属性和方法----------
360截图20200322230630838.jpg
360截图20200322230650637.jpg

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-3-22 23:10:24 | 显示全部楼层
本帖最后由 15195775117 于 2020-10-22 17:13 编辑

----------请求的钩子----------
有时需要在处理请求的前后执行某些常用代码,例如验证身份,
为了避免在每个视图函数中都写这种代码,flask提供了“注册通用函数”的功能,
注册的函数在请求被分派到视图函数的前或后调用。
“请求钩子”通过装饰器实现,钩子分4种:
360截图20200322230923534.jpg
在“请求钩子函数”和“视图函数”之间共享数据,一般使用“上下文全局变量”g。
例如,before_request从数据库中加载已登录用户,并保存于g.user中。

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表