文章目录
python实用库
加解密 —— itsdangerous
将数据传递给第三方时,需要对数据进行加密,防止数据被篡改。比如给用户发送带有链接的邮件
官方文档
- 安装与更新
pip install -U itsdangerous
- 基本使用
from itsdangerous import TimedJSONWebSignatureSerializer as jws_auth
SECRET_KEY = "8850f888-15d6-11ea-96f6-a0afbdb7e009"
def test_json_web_signature():
auth = jws_auth(secret_key=SECRET_KEY, salt="My Salt", expires_in=5) # 5秒后过期
token = auth.dumps(dict(id=2, name="LiSa"))
data = auth.loads(token, salt="My Salt")
print(data["name"])
time.sleep(6)
# 此处会报错 itsdangerous.exc.SignatureExpired: Signature expired
data2 = auth.loads(token, salt="My Salt")
print(data2["name"])
全文检索框架 —— haystack
haystack支持Solr、Whoosh、ElasticSearch、Xapian等搜索引擎,其中Whoosh基于python语言,适合小型网站,这里以之为例。注意:基于django框架.....
官方文档
1. 安装与配置
- 依赖库安装
- pip install django-haystack
- pip install whoosh
- 配置
# settings.py 文件中:
# 1. INSTALLED_APP中加入haystack
# 2. 配置haystack相关属性
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
},
}
# urls.py文件中加入:
urlpatterns = [
path('search/', include('haystack.urls')),
...
]
2. 生成索引文件
- 创建search_indexes文件
from haystack import indexes
from goods.models import GoodsSku
# 命名规范modelIndex, 需要继承indexes.SearchIndex, indexes.Indexable
class GoodsSkuIndex(indexes.SearchIndex, indexes.Indexable):
# 一个searchIndex类中,只能有一个字段的document为True,该字段为主要搜索字段
# use_template 为True时,会取search/indexes/{appName}/{modelName}_text.txt文件中的值生成索引
text = indexes.CharField(document=True, use_template=True)
# status 和 create_time可以提供额外的筛选项
status = indexes.IntegerField(model_attr='status')
create_time = indexes.DateTimeField(model_attr='create_time')
def get_model(self):
"""必须实现的方法,返回索引的Model类"""
return GoodsSku
def index_queryset(self, using=None):
""" 过滤查询出来的数据,eg:已删除、待发布... """
return self.get_model().objects.filter(deleted=False)
- 创建索引模板文件
文件地址为search/indexes/{appName}/{modelName}_text.txt
{{ object.name }} # 商品名称索引
{{ object.desc }} # 商品描述索引
{{ object.spu.desc }} # 商品详情索引
3. 搜索页面
- 搜索页面
{% comment %}
1. action 地址与url中匹配
2. 仅支持get请求
3. 参数名称为q
{% endcomment %}
<form method="get" action="search">
{% csrf_token %}
<input type="text" class="input_text fl" name="q" placeholder="搜索商品">
<input type="submit" class="input_btn fr" name="" value="搜索">
</form>
- 搜索结果
search/search.html
,当有多个搜索项时,需要根据result.content_type的类型,进行判断并引入指定的模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
搜索关键词: {{ query }} <br>
查找结果:{{ page.object_list }} <br>
分页对象:{{ paginator}} <br>
当前页码: {{ page.number }}
{% for result in page.object_list %}
{# 列表中的对象 #}
{{ result.object.id }} {{ result.object.name }}
{% endfor %}
<a href="serach?q={{ query }}&page={{ page.previous_page_number }}">《上一页</a>
<a href="serach?q={{ query }}&page={{ page.next_page_number }}?sort={{ sort }}">下一页》</a>
{% for result in page.object_list %}
{% if result.content_type == "blog.post" %}
{% include "search/includes/blog/post.html" %}
{% endif %}
{% if result.content_type == "media.photo" %}
{% include "search/includes/media/photo.html" %}
{% endif %}
{% empty %}
<p>No results found.</p>
{% endfor %}
</body>
</html>
4. 生成索引
执行python manage.py rebuild_index
5. 自定义分词器
- 安装jieba分词库
pip install jieba
- 自定义分词器
在对应的python解释器环境中haystack/backentds目录下创建chinese_analyzer.py文件
import jieba
from whoosh.analysis import Tokenizer, Token
class ChineseTokenizer(Tokenizer):
def __call__(self, value, positions=False, chars=False,
keeporiginal=False, removestops=True,
start_pos=0, start_char=0, mode='', **kwargs):
t = Token(positions, chars, removestops=removestops, mode=mode, **kwargs)
seglist = jieba.cut(value, cut_all=True)
for w in seglist:
t.original = t.text = w
t.boost = 1.0
if positions:
t.pos = start_pos + value.find(w)
if chars:
t.startchar = start_char + value.find(w)
t.endchar = start_char + value.find(w) + len(w)
yield t
def ChineseAnalyzer():
return ChineseTokenizer()
- 自定义backend
复制whoosh_backend.py文件,改为whoosh_chinese_backend.py
# 1. 导入自定义分词器
from .chinese_analyzerimport ChineseAnalyzer
# 2. 删除默认分词器analyzer=StemmingAnalyzer()
analyzer=ChineseAnalyzer()
- 修改settings.py文件中的配置项
HAYSTACK_CONNECTIONS = {
'default': {
# 'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
'ENGINE': 'haystack.backends.whoosh_chinese_backend.WhooshEngine',
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
},
}
- 重新创建索引数据
python manage.py rebuild_index
支付宝支付SDK —— python-alipay-sdk
安装方式 pip install python-alipay-sdk
使用方法参考项目git介绍
alipay-sdk-python
是官方提供的SDK,但是有毒
云存储 —— qiniu
异步任务 —— celery
window上启动
windows系统启动:
https://blog.csdn.net/weixin_44520259/article/details/106898219
1. celery -A modulename worker -l info --pool=solo
2. pip install gevent
celery -A modulename worker -l info -P gevent
version4 task命名
Did you remember to import the module containing this task?Or maybe you’re using relative imports?
在任务命名时,指定文件相对路径,即可在其它模块中引用
from __future__ import absolute_import
from celery import Celery
# 第一种
app = Celery('ta', broker=CELERY_BROKER_URL)
@app.task(name="yt_common/celery_task/export_excel_task")
def add(x, y):
print x, y, 'aaaaa'
return x + y
# 第二种 重写 gen_task_name方法
class MyCelery(Celery):
def gen_task_name(self, name, module):
"""自定义任务名称"""
if not module.startswith(__name__):
module = "{}.{}".format(__name__, module)
return super(MyCelery, self).gen_task_name(name, module)
持续更新…