wx.requestSubscribeMessage 小程序模版消息升级为订阅消息, | 微信开放社区
wx.requestSubscribeMessage(Object object) | 微信开放文档
调起客户端小程序订阅消息界面,返回用户订阅消息的操作结果。当用户勾选了订阅面板中的“总是保持以上选择,不再询问”时,模板消息会被添加到用户的小程序设置页,通过 wx.getSetting 接口可获取用户对相关模板消息的订阅状态
common/libs/queue/QueueService.py
# -*- coding: utf-8 -*-
import json
from common.models.queue.QueueList import QueueList
from common.libs.Helper import getCurrentDate
from application import app,db
class QueueService():
@staticmethod
def addQueue( queue_name,data = None ):
model_queue = QueueList()
model_queue.queue_name = queue_name
if data:
model_queue.data = json.dumps( data )
model_queue.created_time = model_queue.updated_time = getCurrentDate()
db.session.add( model_queue )
db.session.commit()
return True
数据库common/models/queue/QueueList.py
DROP TABLE IF EXISTS `queue_list`;
CREATE TABLE `queue_list` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`queue_name` varchar(30) NOT NULL DEFAULT '' COMMENT '队列名字',
`data` varchar(500) NOT NULL DEFAULT '' COMMENT '队列数据',
`status` tinyint(1) NOT NULL DEFAULT '-1' COMMENT '状态 -1 待处理 1 已处理',
`updated_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间',
`created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '插入时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='事件队列表';
flask-sqlacodegen 'mysql://root:root@127.0.0.1/food_db' --tables queue_list --outfile "common/models/pay/QueueList.py" --flask
jobs/launcher.py
# -*- coding: utf-8 -*-
from application import app,manager
from flask_script import Command,Option
import argparse,sys,traceback
'''
python manage.py runjob -m Test ( jobs/tasks/Test.py )
python manage.py runjob -m test/Index ( jobs/tasks/test/Index.py )
* name or flags - 名称或选项字符串列表, e.g. foo or -f, --foo.
* action - 参数如果定义了选项,表示这是一个操作参数,至于调用时做哪种操作由用户输入或者default决定。
* nargs - 应该使用的命令行参数数。.
* const - 某些动作或参数个数的常数值。.
* default - 如果命令行没有对输入这个参数相应的值,则此参数用default给出的值.
* type -将用户输入的值转化为哪种类型.
* choices - 参数可输入值的范围或选择.
* required - 命令行输入的值是否可以被忽略(布尔量).
* help - 参数的简要描述.
* metavar - useage中显示的参数的名称.
* dest - 要添加到解析参数返回的对象中的属性的名称.
'''
class runJob( Command ):
capture_all_args = True
def run(self,*args,**kwargs):
args = sys.argv[2:]
parser = argparse.ArgumentParser( add_help = True )
parser.add_argument("-m","--name",dest = "name",metavar = "name", help="指定job名",required=True)
parser.add_argument("-a","--act",dest = "act",metavar = "act", help="Job动作",required=False)
parser.add_argument("-p","--param",dest = "param",nargs = "*", metavar = "param",help="业务参数",default = '',required=False)
params = parser.parse_args( args )
# app.logger.info( sys.argv)
params_dict = params.__dict__
ret_params = {}
for item in params_dict.keys():
ret_params[ item ] = params_dict[ item ]
if "name" not in ret_params or not ret_params['name']:
return self.tips()
module_name = ret_params['name'].replace( "/","." )
try:
import_string = "from jobs.tasks.%s import JobTask as job_target" % ( module_name )
exec( import_string , globals() )
target = job_target()
target.run( ret_params )
except Exception as e:
traceback.print_exc()
def tips(self):
tip_msg = '''
请正确调度Job
python manage runjob -m Test ( jobs/tasks/Test.py )
python manage runjob -m test/Index ( jobs/tasks/test/Index.py )
'''
app.logger.info( tip_msg )
return False
runJob( Command ):
这段代码是一个类runJob
的定义,继承自Command
类。它有一个run
方法,用于执行一些操作。具体的功能如下:
- 通过命令行参数获取
name
、act
和param
的值。 - 如果没有指定
name
或者name
为空,则返回一个提示信息。 - 将
name
中的斜杠替换为点,到module_name
。 - 其他的代码逻辑没有提供,无法判断具体的作用。
app.logger.info()
是一个用于记录信息级别日志的方法。它可以用来记录一些重要的信息,但不会被标记为错误级别。下面是一个示例:
app.logger.info('message info is %s', message, exc_info=1)
这个示例中,'message info is %s’是日志消息的格式字符串,%s是一个占位符,用于将变量message的值插入到字符串中。exc_info=1参数用于在日志中包含异常信息。
app.logger.info( sys.argv)
app.logger.info(params)
app.logger.info(params_dict)
app.logger.info (import_string)
(imooc)[root@localhost order]# python manager.py runjob -m test/Index -a ttt -p dddd
[2018-08-12 11:29:22,917] INFO in launcher:['manager.py', 'runjob', '-m', 'test/Index', '-a', 'ttt', '-p', 'dddd']
[2018-08-12 11:29:22,918] INFO in launcher:Namespace(act='ttt', name='test/Index', param=['dddd'])
[2018-08-12 11:29:22,918] INFO in launcher:{'name':'test/Index', 'act':'ttt', 'param':['dddd']}i am test
[2018-08-12 11:30:42,946] INFO in launcher: from jobs.tasks.test.Index import JobTask as job_target i am test
flask_script中的commands.py 请简单介绍一下python中的command 类
Flask-Script是一个Flask扩展,用于管理和运行命令行脚本。它提供了一个Command类,用于定义自定义命令。通过继承Command类并实现其中的run方法,可以创建自己的命令。
下面是一个简单的示例,展示了如何使用Flask-Script的Command类创建一个自定义命令:
from flask_script import Command
class MyCommand(Command):
def run(self):
print("This is my custom command.")
在上面的示例中,我们创建了一个名为MyCommand的自定义命令,它继承自Flask-Script的Command类。在run方法中,我们定义了命令要执行的操作,这里只是简单地打印一条消息。
要在Flask应用中使用这个自定义命令,需要将其添加到Manager对象中,然后通过命令行运行。下面是一个完整的示例:
from flask import Flask
from flask_script import Manager
app = Flask(__name__)
manager = Manager(app)
@manager.command
def mycommand():
print("This is my custom command.")
if __name__ == '__main__':
manager.run()
在上面的示例中,我们创建了一个Flask应用,并创建了一个Manager对象。通过装饰器@manager.command,我们将mycommand函数注册为一个命令。当我们在命令行中运行python app.py mycommand
时,就会执行mycommand函数中定义的操作。
import_string = "from jobs.tasks.%s import JobTask as job_target" % ( module_name )
exec( import_string , globals() )
这段代码是使用Python中的exec函数动态导入模块并执行其中的代码。具体来说,它根据给定的module_name字符串动态生成一个import语句,并将其作为字符串传递给exec函数进行执行。这样可以根据不同的module_name值导入不同的模块,并执行其中的代码。
下面是一个示例:
module_name = "example_module"
import_string = "from jobs.tasks.%s import JobTask as job_target" % (module_name)
exec(import_string, globals())
在这个示例中,假设jobs.tasks模块下有一个名为example_module的模块,并且该模块中定义了一个名为JobTask的类。通过将module_name设置为"example_module",我们可以动态导入该模块,并将其中的JobTask类赋值给job_target变量。
请注意,使用exec函数动态导入模块和执行代码是一种强大但潜在危险的操作。在实际使用中,应该谨慎考虑安全性和可维护性,并确保只导入可信的模块。
flask-script 第三方库为什么不更新了?
flask-script 第三方库不再更新的原因可能是因为它的功能已经被集成到 Flask 框架中,或者有其他更好的替代方案出现。Flask 官方文档中也建议使用 Flask 的命令行接口(Flask CLI)来替代 flask-script。Flask CLI 提供了更简洁、更强大的命令行操作项目的方式。
如果你仍然想使用 flask-script,你可以继续使用它,但需要注意它可能不再得到官方的更新和支持。另外,你也可以考虑迁移到其他类似的第三方库,如 Click 或 Fire,它们提供了更多的功能和更好的兼容性。
mina/pages/my/order_list.js
<view class="container">
<view class="status-box">
<view bindtap="statusTap" class="status-label {{index == currentType ? 'active' : ''}}" wx:for-items="{{statusType}}" wx:key="{{index}}" data-index="{{index}}">
{{item}}
<view class="{{tabClass[index]}}"></view>
</view>
</view>
<view class="no-order" wx:if="{{!order_list.length}}">
<image src="/images/no-order.png" class="no-order-img"></image>
<view class="text">暂无订单</view>
</view>
<view class="order-list" wx:if="{{order_list.length}}">
<view class="a-order" wx:for="{{order_list}}" wx:key="{{index}}" wx:for-item="item">
<view class="order-date" data-id="{{item.order_sn}}" bindtap="orderDetail">
<view class="date-box">下单时间:{{item.date}}</view>
<view class="status {{(item.status==0 || item.status==1) ? '':'red'}}">{{item.status_desc}}</view>
</view>
<view class="goods-info" data-id="{{item.order_sn}}" bindtap="orderDetail">
<view class="goods-des">
<view>订单号:{{item.order_number}} </view>
<view wx:if="{{item.note && item.note != ''}}">备注: {{item.note}}</view>
</view>
</view>
<view >
<scroll-view class="goods-img-container" scroll-x="true">
<view class="img-box" wx:for="{{item.goods_list}}" wx:for-item="itemGood">
<image src="{{itemGood.pic_url}}" class="goods-img"></image>
</view>
</scroll-view>
</view>
<view class="price-box">
<view class="total-price">合计:¥ {{item.total_price}}</view>
<view class="btn cancel-btn" bindtap="orderCancel" data-id="{{item.order_sn}}" wx:if="{{item.status==-8}}">取消订单</view>
<view class="btn topay-btn" bindtap="toPay" data-id="{{item.order_sn}}" wx:if="{{item.status==-8}}">马上付款</view>
<view class="btn topay-btn" bindtap="orderConfirm" data-id="{{item.order_sn}}" wx:if="{{item.status==-6}}">确认收货</view>
<view class="btn topay-btn" bindtap="orderComment" data-id="{{item.order_sn}}" wx:if="{{item.status==-5}}">走,去评价</view>
</view>
</view>
</view>
</view>
price-box
data-id
data-id是一种HTML属性,用于标识元素的唯一性。它可以用于JavaScript和CSS中,以便对元素进行操作或样式设置。data-id的值可以是任何字符串,通常用于存储与元素相关的数据或标识符。通过使用data-id属性,可以方便地在前端代码中引用和操作特定的元素。例如,可以使用data-id来选择特定的元素并对其进行样式修改或事件绑定。
-
这段代码是一个小程序的视图部分,主要展示了一个订单的价格信息和相关操作按钮。具体解释如下:
-
<view class="price-box">
:这是一个视图容器,用于包裹订单价格和操作按钮。 -
<view class="total-price">合计:¥ {{item.total_price}}</view>
:这是一个展示订单总价的文本视图,使用了小程序的数据绑定语法{{item.total_price}}
来显示订单的总价。 -
<view class="btn cancel-btn" bindtap="orderCancel" data-id="{{item.order_sn}}" wx:if="{{item.status==-8}}">取消订单</view>
:这是一个取消订单的按钮,当订单状态为-8时才会显示。点击按钮会触发名为orderCancel
的事件,并传递订单编号item.order_sn
作为参数。 -
<view class="btn topay-btn" bindtap="toPay" data-id="{{item.order_sn}}" wx:if="{{item.status==-8}}">马上付款</view>
:这是一个立即付款的按钮,当订单状态为-8时才会显示。点击按钮会触发名为toPay
的事件,并传递订单编号item.order_sn
作为参数。 -
<view class="btn topay-btn" bindtap="orderConfirm" data-id="{{item.order_sn}}" wx:if="{{item.status==-6}}">确认收货</view>
:这是一个确认收货的按钮,当订单状态为-6时才会显示。点击按钮会触发名为orderConfirm
的事件,并传递订单编号item.order_sn
作为参数。 -
<view class="btn topay-btn" bindtap="orderComment" data-id="{{item.order_sn}}" wx:if="{{item.status==-5}}">走,去评价</view>
:这是一个去评价的按钮,当订单状态为-5时才会显示。点击按钮会触发名为orderComment
的事件,并传递订单编号item.order_sn
作为参数。