今天又开始了flask的学习,编程浪子师傅 强调:
1. 链接管理器的重要性,并要求一定要掌握和使用 链接管理器:
2. 当更换服务器框架的时候,链接管理器 可以帮我们省下很多时间。
问题1 : 链接管理器究竟是什么?
Flask中的 链接管理器 是一个用于 管理URL路由 和 视图函数之间映射关系 的 工具。它允许开发者定义 不同的 URL规则,并将它们与相应的 视图函数 关联起来。链接管理器可以帮助开发者更好地 组织 和 管理 应用程序 的 路由,使得 代码 更加清晰 和 易于维护。
下面是一个使用Flask链接管理器的简单示例:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello, World!'
@app.route('/about')
def about():
return 'This is the about page.'
if __name__ == '__main__':
app.run()
在上面的示例中,我们使用@app.route()
装饰器来定义了两个路由规则。@app.route('/')
表示根路径,对应的视图函数是index()
;@app.route('/about')
表示/about
路径,对应的视图函数是about()
。当用户访问对应的URL时,Flask会自动调用相应的视图函数并返回结果。
链接管理器 还支持 动态路由 ,可以通过在 路由规则中 使用 变量 来实现。例如:
@app.route('/user/')
def user_profile(username):
return f'Hello, {username}!'
在上面的示例中,
是一个动态变量,可以匹配任意字符串,并将其作为参数传递给user_profile()
视图函数。
总结一下,Flask中的 链接管理器 是一个用于定义 URL路由规则 和 视图函数之间映射关系 的工具,它可以帮助开发者 更好地组织 和 管理应用程序的路由。
下面再看一下编程浪子所说的 链接管理器 static/js/common.js
var common_ops = {
init:function(){
this.eventBind();
this.setMenuIconHighLight();
},
...,
buildUrl:function( path, params){
var url = ""+path;
var _paramUrl = "";
if( params ){
_paramUrl = Object.keys( params).map( function (k){
return [encodeURIComponent(k), encodeURIComponent( params[k])].join("=");
}).join("&");
_paramUrl = "?" +_paramUrl;
}
return url + _paramUrl;
},
buildPicUrl:function( img_key){
var domain = $(".hidden_layout_wrap input[name=domain]").val();
var prefix_url = $(".hidden_layout_wrap input[name=prefix_url]").val();
return domain + prefix_url + img_key;
}
};
该函数接受两个参数:path
和params
。path
是URL的路径部分,params
是一个包含参数的对象。函数首先将path
赋值给url
变量,然后初始化_paramUrl
为空字符串。
接下来,函数检查params
是否存在。如果存在,函数使用Object.keys(params)
获取params
对象的所有键,并使用map
循环
方法对每个键进行处理。在处理过程中,函数使用encodeURIComponent
方法对键和对应的值进行编码,并使用join("=")
将它们连接起来。最后,使用join("&")
将所有参数连接起来,并将结果赋值给_paramUrl
。
最后,函数将url
和_paramUrl
连接起来,并返回构建好的URL。
encodeURIComponent( params[k] ) 中的params[k] 是 k的值value 值
return返回的params值:
params = {
a: "b",
c: "d"
};
拼接结果是一个数组再用.join("&"): a=b&c=d
然后再static/js/user/login.js中使用ajax使用
$.ajax({
url:common_ops.buildUrl("/user/login"),
type:'POST',
data:{'login_name':login_name, 'login_pwd':login_pwd},
dataType:'json',
success:function(res){
btn_target.removeClass("disabled");
var callback = null;
if(res.code == 200){
callback = function(){
window.location.href = common_ops.buildUrl('/');
}
}
common_ops.alert( res.msg, callback);
}
});
问题2: 中 的?作用是什么? 在ajax 调用buildUrl中并没有给params赋值,buildUrl是怎么完成if判断的 ?
在给定的代码中,?
是用作URL中的查询字符串的分隔符。它用于将URL的路径和查询参数分开。在buildUrl
函数中,如果params
存在,则会将其转换为查询字符串,并将其添加到URL的末尾。如果params
不存在,则不会添加查询字符串。
在ajax调用中,buildUrl
函数没有给params
赋值,这是因为在这个特定的例子中,params
参数可能是可选的。如果没有提供params
参数,buildUrl
函数将返回一个不带查询字符串的URL。
问题3: 本段代码中 返回的_paramUrl 值是什么
变量_paramUrl
的值是根据params
对象构建的查询字符串。它将params
对象的键和值进行URL编码,并使用等号和连接符&
连接起来。最后,将查询字符串添加到url
后面。所以_paramUrl
的值是类似于?login_name=xxx&login_pwd=xxx
的字符串。
问题4: 返回的_paramUrl 值是什么? return的 url + _paramUrl的值又是什么?
_paramUrl
的值是一个字符串,它包含了通过params
参数构建的URL查询参数。_paramUrl
的格式是key1=value1&key2=value2&...
,其中key1
和value1
是params
中的第一个键值对,key2
和value2
是params
中的第二个键值对,以此类推。_paramUrl
的值将作为URL的查询参数部分。
url + _paramUrl
的值是将url
和_paramUrl
拼接在一起形成的完整URL。其中,url
是一个字符串,表示请求的路径,_paramUrl
是一个字符串,表示URL的查询参数部分。拼接后的完整URL将用于发送AJAX请求。
ajax()相关的剖析:
$.ajax()
函数是jQuery中用于发送异步请求的方法。其中,url
参数指定请求的URL地址,type
参数指定请求的类型(POST),data
参数指定请求的数据(包括login_name
和login_pwd
),dataType
参数指定服务器返回的数据类型(JSON)。该方法会发送一个POST请求到指定的URL,并将login_name
和login_pwd
作为请求的参数。请求成功后,会执行success
回调函数,根据服务器返回的数据进行相应的处理。
详细解释如下:
url:common_ops.buildUrl("/user/login")
:构建请求的URL,使用了common_ops.buildUrl()
方法,将"/user/login"作为路径参数传入,该方法会将路径和参数拼接成完整的URL。type:'POST'
:指定请求的类型为POST。data:{'login_name':login_name, 'login_pwd':login_pwd}
:指定请求的数据,包括login_name
和login_pwd
两个参数,其值分别为变量login_name
和login_pwd
的值。dataType:'json'
:指定服务器返回的数据类型为JSON。以及 /common/libs/UrlManager.py
# -*- coding: utf-8 -*-
import time
from application import app
class UrlManager(object):
def __init__(self):
pass
@staticmethod
def buildUrl( path ):
return path
@staticmethod
#@staticmethod是一个装饰器,用于将类中的方法转换为静态方法。
# 静态方法不需要访问类或实例的任何属性,因此可以直接从类中调用,而无需创建类的实例。
def buildStaticUrl(path):
ver = "%s"%( 22222222 )
path = "/static" + path + "?ver=" + ver
return UrlManager.buildUrl( path )
@staticmethod
def buildImageUrl(path):
app_config = app.config['APP']
url = app_config['domain'] + app.config['UPLOAD']['prefix_url'] + path
return url