【主要内容】
今天继续学习flask这个模块的用法,共用时间60分钟。
(此外整理作笔记花费了约60分钟)
详细学习过程见文末学习过程屏幕录像。
初步了解了flask模块的用法,见识了Python中关于web服务器程序建构模块的强大功力。
主要通过以下网络资源进行学习:
http://docs.jinkan.org/docs/flask/quickstart.html
【学习笔记】
一、Flask创建的服务器对象运行时可以指定相关参数
if __name__=="__main__":
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument('-p', '--port', default=80, type=int, help='监听端口')
args = parser.parse_args()
port = args.port
app.run(host='127.0.0.1', port=port)
昨天的启动对象的部分,只使用了
app.run
于是,默认使用5000端口号,通过 使用
127.0.0.1:5000来访问web服务器
而今天通过修改商品号为80,我就可以直接使用
127.0.0.1
来访问web服务器了。
二、实例化Flask对象的初始化参数由于版本的变化有所不同
我使用的flask版本为v1.0.2
参数按顺序如下:
import_name 实例所依托的模块名或实例名
static_url_path 没有 理解,填写 None就行了
static_folder 静态内容(比如css文件 ,js文件等)存放的目录 名(此目录 在Py文件所在的根目录下。)
static_host 没有理解,填写None就行了。
host_mathing 没有理解,默认值为False就行了。
subdomain_matching 也没有理解,填写False就行了。
template_folder html页面模板所存放的目录(此目录在py文件所在的根目录下。)
instance_path 没有理解,填写None就行了
instance_relative_config 没有理解,填写False就行了
root_path 没有理解,填写None就行了
三、构建html的模板文件
为了使用html模板文件,并验证python文件在服务器端处理客户端发起的post请求的实现,于是建构了一个简单的html模板,存放在与py文件同一目录层级下的一个名为【html】的目录中,同时在第二点中的参数设置中就设置【template_folder】为html。(具体目录实现见学习过程录屏,链接在文末)
这个Html模板文件的内容如下:
```
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>孤荷凌寒的第一个Flask页面</title>
<script src="/jsetc/_ty_ajax_xml.js"></script>
<script src="/jsetc/_ty_function.js"></script>
<script language="javascript" type="text/javascript">
//通过AJAX的方法向服务器端发送post请求
var requestup;
var isrequest_up_runned=false;
//发送post请求
function submitme(){
try{
var stru=document.forms[0].t1.value;
var strb=document.forms[0].t2.value;
//alert(stru);
if(strb!="" && stru!=""){
isrequest_up_runned=true;
var url="/login/";
var strcan="u=" + stru;
strcan=strcan + "&p=" + strb;
requestup=createRequest();
//alert(strcan);
//--request up-----------
ajaxsendtextbypost(requestup,url,strcan,"ajax_submitselect_back");
return true;
}
//----------------------------------
}catch(err){
//alert("提交失败:" + err.description);
}
finally{
}
}
//-----等待服务器返回处理结果-----------------------
function ajax_submitselect_back(){
try{
//-----------------------------------------------
//-----------------------------------------------
if (requestup.readyState == 4) {
if (requestup.status == 200) {
var response = requestup; //无法还原为文本,因此可能需要解码
alert(response);
//alert(instr(response, "okghlh", 0));
document.getElementById("divform").style.display='none';
document.getElementById("divshow").style.display="block";
document.getElementById("divshow").innerHTML=response["txt"];
}else{
//var response2 = unescape(requestup.responseText);
//alert(response2);
}
isrequest_up_runned=false;
}
}catch(err){
//alert("提交可能失败!" + err.description);
isrequest_up_runned=false;
}
}
//最开始是使用的jquery来实现的,但因为服务器端的Py文件代码错误,我以为是这儿的js代码错了,于是没有使用下面的代码 。
//下面的函数没有使用了,但也没有错
function submitme2(){
$.ajax({
url: '/login/',
type: 'POST',
data:'u=' + document.getElementById("t1").value + "&p=" + document.getElementById("t2").value,
success: function(response){
document.getElementById("divform").style.display='none';
document.getElementById("divshow").style.display="block";
document.getElementById("divshow").innerHTML=response["txt"];
},
error: function(error){
console.log(error);
}
});
}
</script>
</head>
<body>
<div id="divform">
<form>
<p>
<span>登录用户名:</span>
<input type="text" id="t1" name="t1">
</p>
<p>
<span>登录密 码:</span>
<input type="password" id="t2" name="t2">
</p>
<p>
<input type="button" id="cmdOk" value="登录" onClick="submitme();">
</p>
</form>
</div>
<div id="divshow" style="display:none;">
</div>
</body>
</html>
```
四、在py文件的代码中,构建了一个虚拟的路径url
/login/
来处理上面的html模板中的js代码通过ajax发起的post请求。
代码如下:
```
@app.route("/login/",methods=["POST"]) #methods参数需要的是一个列表,而且不是method参数,是复数形式
def login():
u=request.form["u"] #这儿是读取客户端传过来的post参数,注意使用的是方括号
p=request.form["p"]
response={
'txt':'当前用户' + u + '登录成功!密码是:' + p
}
return jsonify(response),200 #我不知道为什么要同时返回一个Int值200
```
五、完整的Py文件代码
```
from flask import Flask
import requests
from flask import Flask, jsonify, request, render_template
app=Flask(__name__,None,"jsetc",None,False,False,"html") #此处第一个参数直接使用Py本文件的内置变量__name__,表示服务器程序名称就使用本Py文件的名称。
@app.route("/") #指定显示的实际url相对于WEB应用服务器对象的根目录而言的路径
def index():
return render_template('./i.html')
@app.route("/login/",methods=["POST"]) #methods参数需要的是一个列表,而且不是method参数,是复数形式
def login():
u=request.form["u"] #这儿是读取客户端传过来的post参数,注意使用的是方括号
p=request.form["p"]
response={
'txt':'当前用户' + u + '登录成功!密码是:' + p
}
return jsonify(response),200 #我不知道为什么要同时返回一个Int值200
@app.route("/admin/<u>")
def admin(u):
return "我是管理员登录页,在根目录下的admin子目录下,当前管理员是:" + str(u)
@app.route("/compute/<int:a>/<int:b>")
def compute(a,b):
return str(a) + "乘以" + str(b) + "等于" + str(a*b)
if __name__=="__main__":
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument('-p', '--port', default=80, type=int, help='监听端口')
args = parser.parse_args()
port = args.port
app.run(host='127.0.0.1', port=port)
```
【学习后记】
一、Flask在服务器端对客户端的请求处理比较高效
与我熟悉的asp.net的服务器端架构比较,python来实现感觉更高效,特别是前后端是完全分离的,数据交换更多通过ajax等技术来实现,前后端就完全不会粘连混淆,这点感觉不错。
二、技术学习越早越好
一大把年纪再来学习,真的很痛苦,每天都只好感慨自己“少壮不努力,老大徒伤悲”。岁月不会饶人,这就送给尚且年轻的朋友们吧,凡事趁早,未来会非常美好!
【关于坚持自学的例行说明】
最后例行说明下,我为什么要坚持自学。
一、为什么一把年纪还在学习
放弃很多去聚餐,去HI歌,去游玩,去看电影,去追剧……的时间,然后进行着这个年纪似乎已不应当再进行的学习,引来身边人们无尽的不解与鄙夷甚至可怜……
但我不想放弃终身学习的誓言。
因为——
我对我今天的生活现状并不认同!
罗伯特清崎告诉过我们,反省自己当下的生活是不是自己想要的,这难道不是最好的动力与答案?
走过了大半生,然后才发现曾经、当下所正在进行的人生并不是自己想要的,那是一种怎样的体验?
只有心中真切的感受才能回答这个问题,而任凭再丰富的语言也是无法描绘出来的。
经历半生的跋涉,却发现走得并不正确,有多少人有勇气承认自己过去的一切都是错误的呢?
而我愿意告诉过去的我:“你错了!”
那么已经历半生错误,年岁之大又压于头顶,还有希望从这架的梯子的半端重新爬下,再蹒跚着爬上另一架梯子吗?
我宁愿相信还有希望!
这便是我为什么要继续坚持终身学习下去的全部理由。
二、这个年纪还在学这些技术有意义吗
纯的技术对这把年纪其实已没有意义。
但兴趣可以超越意义。
但技术可以引来思想的变革,这才是意义。
投资自己的头脑 ,改革自己的思想,这是最保值,更长远的投资,过去我从来没有投资过,错过太多,那就从投资自己头脑开始吧。
罗伯特清崎告诉我们,真正的富有是时间的富有;真正的自由是可以决定自己愿意做什么的自由。
因为我愿意做我兴趣所在的事,所以我希望我有自由选择的那一天,虽然今天离那一天可能还是那么遥远,但我愿意相信,每天多赶几步,离希望就更近一步。
再者,虽然我可能再已无法完全完整的掌握这些技术了,但技术本身却可以启迪心的觉醒,激发灵感,那么只要多了解一点,我相信我将离那个正离我而去跑得越来越快的未来更近一点,不至于被未知的那个未来抛弃得太远。
于是我怎能放弃追逐求索的步伐?
我要坚信:感觉太迟的时候,也许还不算太迟。
感谢一直以来关注我,鼓励我的你!
若不嫌弃这一个到了高龄才长大的可笑可叹的我,请不吝赐教。
我的q号是:578652607,敬候你的指点。
【同步语音笔记】
https://www.ximalaya.com/keji/19103006/255132914
【学习过程屏幕录屏】
https://www.bilibili.com/video/av89267641/
链接:https://pan.baidu.com/s/1LjfxhLWuoQFYbkQZ7UNicw
提取码:vfvi