js实现点击复制
js 实现复制的主要命令是 document.execCommand('copy')
,只有在输入框中的内容被选择时执行此命令才有效。
但是一般情况下,我们想要复制的内容并不是输入框中的文字,这时我们把只要临时创建一个 input 元素,将想要复制的内容赋值给 input 的 value 属性,并让它 select,等执行完复制命令后再将其删除就可以了。
代码如下:
1 | <button @click="copy">点击复制</button> |
Vue 插件
Flask用户身份认证
如果是跨域请求,而且在请求头中添加了东西(token),那么每次请求服务器时都会有一个 options 请求(预检请求),这会影响服务器响应的速度。
我们可以通过在响应头中添加 Access-Control-Max-Age 来解决,它的作用是把 OPTIONS 响应缓存起来,在指定的时间内,不会再次发起 OPTIONS 预请求,这样只有在第一次请求的时候会有 OPTIONS ,之后浏览器会从缓存里读取响应,也就不会再发送OPTIONS请求了。
1 | @app.after_request |
跨域用户身份认证方案
session
flask 的 session 机制是根据请求头中携带的 cookie 值创建对应的 session 对象。每有一个新的 cookie 值,就创建一个新的 session 对象,因此每个用户都对应一个 session 对象,不会混乱。
当在 flask 框架中编写前端代码时(同源),后台会携带带有 “Set-Cookie” 的响应头返回给浏览器,那么用户在请求时浏览器会自动携带带有 “Cookie” 的请求头给后台,”Set-Cookie” 和 “Cookie” 中保存的都是 session_id,后台会根据 session_id 找到对应的 session 对象。
python调用支付宝接口
这里使用的是支付宝的沙箱环境:https://open.alipay.com/platform/appDaily.htm。
关于沙箱的具体配置请看 https://opendocs.alipay.com/common/02kkv7。
我们直接来说 python 如何使用支付宝 API。
安装依赖
1 | pip install alipay-sdk-pytho |
使用
实例化客户端
发起支付、查询交易信息、退款等服务都需要实例化一个客户端。
Flask项目配置
创建项目
flask 项目不能像 django 那样通过命令行创建,所以直接在 pycharm 中新建 Flask 项目。
假如我们创建了一个名为 Demo 的项目,那么创建好的项目目录如下所示:
1 | Demo |
只有两个文件夹和一个 py 文件,真不愧是轻量级框架。
- static:存放静态资源,如 css,js
- templates:存放模板,类似 django
- app.py:项目启动文件
然后我们就可以启动项目了。在启动项目之前,需要设置 Flask 的环境变量,打开终端,执行以下指令:
1 | $env:FLASK_APP=app.py |
linux 环境:
1 | export FLASK_APP=app.py |
app.py 就是项目的入口文件,名字依个人而异。
然后启动项目:
1 | flask run |
python循环导入
比如有如下目录结构:
1 | root.py |
root.py:
1 | from A.a import class_a |
a.py:
1 | from B.b import class_b |
b.py:
1 | from A.a import class_a |
此时运行 root.py 会发生报错:
ImportError: cannot import name ‘class_a’ from partially initialized module ‘A.a’ (most likely due to a circular import)
Flask上下文介绍
在程序中我们所写的函数大都不是单独完整的,在使用一个函数完成自身功能的时候,很可能需要同其他的部分进行交互,需要其他外部变量的支持,上下文就是给外部的变量赋值,使函数能正确运行。
Flask 提供了两种上下文,一种是应用上下文(Application Context),一种是请求上下文(Request Context)。
应用上下文和请求上下文都是存放到一个 LocalStack 的栈中的,在应用运行时框架底层会在每个请求进入的时候将请求上下文和应用上下文都推入栈中,因此,在视图函数中,不用担心上下文的问题。
python装饰器
装饰器的作用就是为函数添加额外的功能。
装饰器原理
< 函数+实参高阶函数+返回值高阶函数+嵌套函数+语法糖 = 装饰器 >
直接来看例子:
1 | def x(fuc): # 参数为函数(实参高阶函数) |
其实,函数 x 就可以作为一个装饰器。
接下来用 x 来装饰另一个函数:
1 | def x(fuc): # 参数为函数(实参高阶函数) |
运行代码,结果依次输出 “hello”,”hi”。