APScheduler的一些使用总结

5 篇文章 0 订阅
3 篇文章 0 订阅

最近在写一个爬虫的程序,需要后台定时爬取网站的内容,涉及到SQLAlchemy
因为使用方法的帖子很多,但是很多地方都没有详细讲清楚,自己慢慢实验探索了一下,总结一下
from flask_apscheduler import APScheduler

  1. 首先是关于多模块的定时任务,采取和SQLAlchemy相似的策略。将APScheduler的实例化,配置,实例和配置与Flask的app的连接,分别放在不同的模块,详细下次补充!!(不是本篇重点)
  2. 因为job有两种方式添加,一是在放在配置文件的JOBSlist中,二是实例.add_job(...)

# 对多个函数传递数据模型,模型更改是否生效的测试
def A():
    res = Group.query.filter(Group.groupName == 'IGG').first()
    print('找到IG,将模型传入B')
    B(res)

def B(group):
    print('B函数,欲在B函数中修改模型,测试是否生效')
    group.groupName = 'IG'
    db.session.commit()
    print(Group.query.filter(Group.groupId == group.groupId).first().groupName)
    

待优化

数据库结构

类结构

flask 控制台输出到文件(logging)

异常捕获

导出.sql文件

D:
cd pycharm/项目名
mysqldump -uroot -p contend_observe_system > contend_observe_system.sql

报错

Python3.6报错:ModuleNotFoundError: No module named ‘MySQLdb’
pip install pymysql

然后数据库的配置文件:

DEBUG = True

# dialect+driver://username:password@host:port/database
DIALECT = 'mysql'
# DRIVER = 'mysqldb' # MySQLdb只支持Python2.,还不支持3.
DRIVER = 'pymysql' # 将驱动改成python3支持的pymysql
USERNAME = 'xxxx'
PASSWORD = 'xxxxxxxx'
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'xxxx'
# USERNAME、PASSWORD、DATABASE要记得随着项目和数据库的不同而进行更改
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False


HTTP/1.1 301 Moved Permanently

解决:将http改成了https


删除一个有外键约束的属性

解决:先删除外键约束,再删除属性



502 bad gateway

一般是程序app.py错误,查看error.log文件,一般都可以解决


Mysql错误1452 - Cannot add or update a child row: a foreign key constraint fails

检查是不是创建关系表的时候,外键约束的位置搞错了地方
码住一篇大佬的Mysql错误1452


HTTP 405 Method Not Allowed

一看['GET','POST']是不是请求方式的问题,二看前端的Content-Type是不是application/json,三看前端传输的头部信息


SQLAlchemy不支持日期DateTime类型的模糊查询

假如存入的时间是"%Y-%m-%d %H:%M:%S"这种形式,但是想仅以"%Y-%m-%d来进行模糊查询,不能用xxx.query.filter(xxx.datetime.like(...))这种模糊查询的方式

# 方法一
resFromSql = Contend.query.filter(db.cast(Contend.contendTime, db.Date) == db.cast(eachDate, db.Date)).all()
# 方法二
from sqlalchemy import extract
eachDate = datetime.datetime.strptime(eachDate,"%Y-%m-%d")
                resFromSql = Contend.query.filter(
                    extract('year', Contend.contendTime) == eachDate.year,
                    extract('month', Contend.contendTime) == eachDate.month,
                    extract('day', Contend.contendTime) == eachDate.day).all()

pymysql.err.OperationalError: (1045, "Access denied for user ‘root’@'localhost

错误原因,SQLAlchemy配置文件有错误,仔细检查每一项!!


在for循环中直接更改列表中元素的值不会起作用

animal = ['dog','mouse','pig'] # 欲对每一项进行修改成'welost'

# 这种方式修改列表的值不会起作用
for each in animal:
	each = 'welost'
print(animal) # 结果['dog','mouse','pig']

# 正确修改方式
for index in range(len(animal)):
	animal[index] = 'welost'
print(animal) # 结果['welost','welost','welost']

sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1146, "Table ‘cos.playWithQualification’ doesn’t

php_Myadmin中的查询区分大小写,数据库中存储的表名是全小写playwithqualification,而models.py文件中表的类结构中__tablename__ = playWithQualification,所以查询不到该表。
解决:models中的关系表的类结构中__tablename__要全小写!!


TypeError: string indices must be integers, not str

问题描述:前端同时发送文件(File)与文本(Text),发送的Context-Type是multipart/form-date,其中文本内容有一个表单(字典)嵌套,如下:

data = {
		'userId':'xxxxx',
		'gameId':'1',
		'detail':{ //嵌套
			'hobby':'xxx',
			'advatagement':'xxxxxxxxx
		}
	}

后台收到后,打印出来如下:

{'userId': 'xxxxx', 'gameId': '1', 'detail': '[object Object]'}

在后台暂时没找到能把[object Object]从对象类型解码出来的方法。(对 json的理解不深刻,去查了,前端可以用JSON.stringify()解码出来,后台没得类似的函数可以用)

后面又找到说表单form不能嵌套表单,估计这个可能是正解,所以只能把'detail'里面的项分出来放,如下:

data = {
		'userId':'xxxxx',
		'gameId':'1',
		'hobby':'xxx',
		'advatagement':'xxxxxxxxx
	}

总结一句:Context-Type = multipart/form-date时,文本信息无法进行表单(字典)嵌套
嵌套还是老老实实用application/json


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值