0%

在项目中,我们可能会遇到定时任务,比如要每隔一段时间执行一次任务,并且还需要在不打断循环的基础上修改任务。这时,我们可以使用 APScheduler 框架。

APScheduler 的使用

APScheduler 是一个轻量级的 Python 定时任务调度框架。APScheduler 支持三种调度任务:固定时间间隔,固定时间点(日期),Linux 下的 Crontab 命令。同时,它还支持异步执行、后台执行调度任务。

安装
1
pip install APScheduler
阅读全文 »

js 实现复制的主要命令是 document.execCommand('copy'),只有在输入框中的内容被选择时执行此命令才有效。

但是一般情况下,我们想要复制的内容并不是输入框中的文字,这时我们把只要临时创建一个 input 元素,将想要复制的内容赋值给 input 的 value 属性,并让它 select,等执行完复制命令后再将其删除就可以了。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<button @click="copy">点击复制</button>
<p ref="p">hello world</p>

<script>
copy() {
const val = this.$refs.p.innerText;
const input = document.createElement('input');
input.value = val;
document.body.appendChild(input);
input.select();
if(document.execCommand('copy')) {
input.remove();
this.$message({
type: 'success',
message: '复制成功'
});
}
}
</script>

图片预览

安装
1
npm install v-viewer
引入

main.js:

1
2
3
4
import Viewer from "v-viewer";
import 'viewerjs/dist/viewer.css';

Vue.use(Viewer)
使用

使用时只需在父标签中加上 v-viewer 属性,它会自动作用于子 img 标签。

1
2
3
<div v-viewer>
<img src="" alt=""/>
</div>

点击图片时就会弹出预览的界面。

阅读全文 »

如果是跨域请求,而且在请求头中添加了东西(token),那么每次请求服务器时都会有一个 options 请求(预检请求),这会影响服务器响应的速度。

我们可以通过在响应头中添加 Access-Control-Max-Age 来解决,它的作用是把 OPTIONS 响应缓存起来,在指定的时间内,不会再次发起 OPTIONS 预请求,这样只有在第一次请求的时候会有 OPTIONS ,之后浏览器会从缓存里读取响应,也就不会再发送OPTIONS请求了。

1
2
3
4
@app.after_request
def addHeaders(response):
response.headers['Access-Control-Max-Age'] = '2592000'
return response

跨域用户身份认证方案

session

flask 的 session 机制是根据请求头中携带的 cookie 值创建对应的 session 对象。每有一个新的 cookie 值,就创建一个新的 session 对象,因此每个用户都对应一个 session 对象,不会混乱。

当在 flask 框架中编写前端代码时(同源),后台会携带带有 “Set-Cookie” 的响应头返回给浏览器,那么用户在请求时浏览器会自动携带带有 “Cookie” 的请求头给后台,”Set-Cookie” 和 “Cookie” 中保存的都是 session_id,后台会根据 session_id 找到对应的 session 对象。

阅读全文 »

创建项目

flask 项目不能像 django 那样通过命令行创建,所以直接在 pycharm 中新建 Flask 项目。

假如我们创建了一个名为 Demo 的项目,那么创建好的项目目录如下所示:

1
2
3
4
Demo
- static
- templates
- app.py

只有两个文件夹和一个 py 文件,真不愧是轻量级框架。

  • static:存放静态资源,如 css,js
  • templates:存放模板,类似 django
  • app.py:项目启动文件

然后我们就可以启动项目了。在启动项目之前,需要设置 Flask 的环境变量,打开终端,执行以下指令:

1
2
$env:FLASK_APP=app.py
$env:FLASK_ENV=development

linux 环境:

1
2
export FLASK_APP=app.py
export FLASK_ENV=development

app.py 就是项目的入口文件,名字依个人而异。

然后启动项目:

1
flask run
阅读全文 »

比如有如下目录结构:

1
2
3
4
5
6
7
root.py
- A
- __init__.py
- a.py
- B
- __init__.py
- b.py

root.py:

1
from A.a import class_a

a.py:

1
2
3
4
from B.b import class_b

class class_a:
pass

b.py:

1
2
3
4
from A.a import class_a

class class_b:
pass

此时运行 root.py 会发生报错:

ImportError: cannot import name ‘class_a’ from partially initialized module ‘A.a’ (most likely due to a circular import)

阅读全文 »

在程序中我们所写的函数大都不是单独完整的,在使用一个函数完成自身功能的时候,很可能需要同其他的部分进行交互,需要其他外部变量的支持,上下文就是给外部的变量赋值,使函数能正确运行。

Flask 提供了两种上下文,一种是应用上下文(Application Context),一种是请求上下文(Request Context)。

应用上下文和请求上下文都是存放到一个 LocalStack 的栈中的,在应用运行时框架底层会在每个请求进入的时候将请求上下文和应用上下文都推入栈中,因此,在视图函数中,不用担心上下文的问题。

阅读全文 »

装饰器的作用就是为函数添加额外的功能。

装饰器原理

< 函数+实参高阶函数+返回值高阶函数+嵌套函数+语法糖 = 装饰器 >

直接来看例子:

1
2
3
4
5
def x(fuc): # 参数为函数(实参高阶函数)
def y(): # 嵌套函数
fuc()
print("hai")
return y # 返回一个函数(返回值高阶函数)

其实,函数 x 就可以作为一个装饰器。

接下来用 x 来装饰另一个函数:

1
2
3
4
5
6
7
8
9
10
11
def x(fuc): # 参数为函数(实参高阶函数)
def y(): # 嵌套函数
fuc()
print("hai")
return y # 返回一个函数(返回值高阶函数)

def test(): # 被装饰函数
print('hello')

test = X(test)
test()

运行代码,结果依次输出 “hello”,”hi”。

阅读全文 »

module

表示当前操作的对象在哪个模块,即所在包的包名,若不在包中,则为”main“。

1
2
3
4
from A.B import C

c = C()
print(c.__module__) # A.B

class

表示当前操作的对象的类是什么。

1
2
3
4
from A.B import C

c = C()
print(c.__class__) # A.B.C

阅读全文 »