翼度科技»论坛 编程开发 python 查看内容

Python开发的常用组件

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
1. 生成6位数字随机验证码
  1. import random
  2. import string
  3. def num_code(length=6):
  4.     """
  5.     生成长度为length的数字随机验证码
  6.     :param length: 验证码长度
  7.     :return: 验证码
  8.     """
  9.     return ''.join(random.choice(string.digits) for i in range(0, length))
复制代码
2.md5加密
  1. import  hashlib
  2. # md5加密
  3. def md5_encrypt(en_str):
  4.     """
  5.     使用md5二次加密生成32位的字符串
  6.     :param en_str: 需要加密的字符串
  7.     :return: 加密后的字符串
  8.     """
  9.     md5 = hashlib.md5()  # 使用MD5加密模式
  10.     md5.update(en_str.encode('utf-8'))  # 将参数字符串传入
  11.     md5.update(md5.hexdigest().encode('utf-8'))  # md5二次加密
  12.     return md5.hexdigest()
复制代码
3. 生成唯一token
  1. import uuid
  2.     import  hashlib
  3.     def only_token():
  4.         """
  5.         使用md5加密uuid生成唯一的32位token
  6.         :return: 加密后的字符串
  7.         """
  8.     md5 = hashlib.md5()  # 使用MD5加密模式
  9.     md5.update(str(uuid.uuid1()).encode('utf-8'))
  10.     return md5.hexdigest()
复制代码
4、发送手机验证码
  1. #验证码管理表
  2. class AuthCode(models.Model):
  3.     name = models.CharField(max_length=10,default=None, null=True, blank=True,verbose_name='姓名')
  4.     phone = models.CharField(max_length=11, unique=True, verbose_name='手机号')
  5.     code = models.CharField(max_length=6,verbose_name='验证码')
  6.     purpose = models.IntegerField(default=0,verbose_name='用途:0->注册验证 1->找回密码 2->其它')
  7.     sendNum = models.IntegerField(default=0,verbose_name='发送次数')
  8.     isCanGet = models.BooleanField(default=0,verbose_name='0->可以获取,1->不可以获取')
  9.     recentlySendTime = models.DateTimeField(auto_now_add=True,verbose_name='最近一次发送时间')
  10.     creation_time = models.DateTimeField(auto_now=True, verbose_name='创建时间')
  11.     class Meta:
  12.         verbose_name = '手机验证码'
  13.         verbose_name_plural = verbose_name
复制代码
实现逻辑
  1. import http.client
  2. import urllib
  3. # 使用互亿无线
  4. host = "106.ihuyi.com"
  5. sms_send_uri = "/webservice/sms.php?method=Submit"
  6. # 查看用户名 登录用户中心->验证码通知短信>产品总览->API接口信息->APIID
  7. account = "你的用户名"
  8. # 查看密码 登录用户中心->验证码通知短信>产品总览->API接口信息->APIKEY
  9. password = "你的密码"
  10. def send_sms(text, mobile):
  11.     text = f"您的验证码是:{text}。请不要把验证码泄露给其他人。"
  12.     params = urllib.parse.urlencode(
  13.         {'account': account, 'password': password, 'content': text, 'mobile': mobile, 'format': 'json'})
  14.     headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
  15.     conn = http.client.HTTPConnection(host, port=80, timeout=30)
  16.     conn.request("POST", sms_send_uri, params, headers)
  17.     response = conn.getresponse()
  18.     response_str = response.read()
  19.     conn.close()
  20.     return response_str
  21. if __name__ == '__main__':
  22.     mobile = "手机号"
  23.     text = '123122'
  24.     print(json.loads(send_sms(text, mobile).decode('utf-8')))
复制代码
5、生成二维码
  1. import qrcode
  2. import io
  3. def maker_qrcode(url):
  4.     """
  5.     生成二维码
  6.     :param url: 需要生成二维码的url
  7.     :return: 返回图片字节流
  8.     """
  9.     image = qrcode.make(url)  # 创建二维码片
  10.     buffer = io.BytesIO()
  11.     # 将图片内容丢入容器
  12.     image.save(buffer, 'png')
  13.     # 返回容器内的字节
  14.     return buffer.getvalue()
  15. 或者
  16. from .settings import BASE_DIR
  17. def create_qrcode(name, url):
  18.     """
  19.     生成机器扫码支付二维码
  20.     :param name: 图片名称
  21.     :param url: 支付路由
  22.     :return:
  23.     """
  24.     img = qrcode.make(url, border=0)  # 创建二维码片
  25.     save_path = BASE_DIR + '/' + name + '.png'
  26.     print(save_path)
  27.     img.save(save_path)
  28.     return img
复制代码
6.微信群发
  1. # coding=utf8
  2. import itchat, time
  3. itchat.auto_login(True)
  4. SINCERE_WISH = u'祝%s新年快乐!'
  5. friendList = itchat.get_friends(update=True)[35:]
  6. count = 0
  7. for  index,friend in enumerate(friendList):
  8.     print(index,friend['DisplayName'],friend['NickName'])
  9.     itchat.send(SINCERE_WISH % (friend['DisplayName']
  10.                                 or friend['NickName']), friend['UserName'])
  11.     time.sleep(2)
  12.     print('备注名称',friend['DisplayName'],'昵称',friend['NickName'],'用户名',friend['UserName'])
  13. print("----end----")
  14. """
  15. # 发送文本
  16. itchat.send('Hello, WeChat!')
  17. # 发送图片
  18. itchat.send_image('my_picture.png')
  19. # 发送视频
  20. itchat.send_video('my_video.mov')
  21. # 发送文件
  22. itchat.send_file('my_file.zip')
  23. """
复制代码
7、微信自动回复
  1. # -*- coding=utf-8 -*-
  2. import requests
  3. import itchat
  4. import random
  5. #图灵机器人
  6. #http://www.tuling123.com/member/robot/1380138/center/frame.jhtml?page=0&child=0获取apikey
  7. KEY = '你的KEY'
  8. def get_response(msg):
  9.     apiUrl = 'http://www.tuling123.com/openapi/api'
  10.     data = {
  11.         'key'    : KEY,
  12.         'info'   : msg,
  13.         'userid' : 'wechat-robot',
  14.     }
  15.     try:
  16.         r = requests.post(apiUrl, data=data).json()
  17.         return r.get('text')
  18.     except:
  19.         return
  20. @itchat.msg_register(itchat.content.TEXT)
  21. def tuling_reply(msg):
  22.     defaultReply = 'I received: ' + msg['Text']
  23.     robots=['','','']
  24.     reply = get_response(msg['Text'])+random.choice(robots)
  25.     return reply or defaultReply
  26. itchat.auto_login(enableCmdQR=False)
  27. itchat.run()
复制代码
8、提取Django中model中的字段名变成字典、列表
  1. import re
  2. t = """
  3.     goods_id = models.IntegerField(verbose_name='商品编号')
  4.     label_code = models.CharField(max_length=20, verbose_name='商品标签')
  5. """
  6. # 字典
  7. print({k:None for k in re.findall('([a-z_A-Z]+)\s=\s',t)})
  8. # 列表
  9. # print([k for k in re.findall('([a-z_A-Z]+)\s=\s',t)])
  10. 输出
  11. {'goods_id': None, 'lable_code': None}
复制代码
9、数据库中给表创建数据
  1. import pymysql
  2. def createData(dataDict,tableName):
  3.     """
  4.     给数据表创建数据
  5.     :param dataDict: 字典
  6.     :param tableName: 表名
  7.     :return:
  8.     """
  9.     #连接数据库
  10.     conn = pymysql.connect(
  11.         host='192.168.0.188', #数据库所在地址URL
  12.         user='root', #用户名
  13.         password='123456', #密码
  14.         database='名称', #数据库名称
  15.         port=3306,  #端口号
  16.         charset='utf8'
  17.     )
  18.     #拿到查询游标
  19.     cursor = conn.cursor()
  20.     clos,value = zip(*dataDict.items())
  21.     sql = "INSERT INTO `%s`(%s) VALUES (%s)" % (tableName,
  22.                                                 ','.join(clos),
  23.                                                 ','.join(['%s'] * len(value))
  24.                                                 )
  25.     print(sql)
  26.     cursor.execute(sql, value)
  27.     conn.commit()
  28.     cursor.close()
  29.     conn.close()
  30.     print('Done')
复制代码
10.捕捉异常
  1. try:
  2.     pass
  3. except 异常类型 as e:
  4.     pass
  5. finally:
  6.     pass
  7. 异常类型
  8. Exception  全部异常
  9. AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x
  10. IOError 输入/输出异常;基本上是无法打开文件
  11. ImportError 无法引入模块或包;基本上是路径问题或名称错误
  12. IndentationError 语法错误(的子类) ;代码没有正确对齐
  13. IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
  14. KeyError 试图访问字典里不存在的键
  15. KeyboardInterrupt Ctrl+C被按下
  16. NameError 使用一个还未被赋予对象的变量
  17. SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
  18. TypeError 传入对象类型与要求的不符合
  19. UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
  20. ValueError 传入一个调用者不期望的值,即使值的类型是正确的
复制代码
11、获取当前时间
  1. import datetime
  2. current_time = str(datetime.datetime.now())[:19]
  3. print(current_time)
  4. 输出格式如:2018-10-20 10:01:43
  5. local_time = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
  6. print(local_time)
复制代码
12、订单编号
  1. from random import Random
  2. import time
  3. def random_str(randomlength=8):
  4.     str = ''
  5.     chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
  6.     length = len(chars) - 1
  7.     random = Random()
  8.     for i in range(randomlength):
  9.         str+=chars[random.randint(0, length)]
  10.     return str
  11. def order_num():
  12.     """
  13.     生成付款订单号
  14.     :return:
  15.     """
  16.     local_time = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
  17.     result = local_time + random_str(5)
  18.     return result
  19. print(order_num())
复制代码
13、mysql自动填写当前时间
  1. CURRENT_TIMESTAMP
复制代码
  1. 为表添加索引
  2. ALTER table tableName ADD INDEX indexName(columnName)
复制代码
14、drf动态过滤查询
  1. # page.py
  2. from rest_framework.pagination import PageNumberPagination
  3. class UserPagination(PageNumberPagination):
  4.     """用户分页器"""
  5.     page_size = 10  # 默认的页面数据数量
  6.     page_query_param = 'page'  # 定制取数据页码key
  7.     page_size_query_param = 'page_size'  # 默认取数据页码key
  8.     max_page_size = 15   # 数据每页取值的最大上限
  9. # serializers.py
  10. from rest_framework import serializers
  11. from user.models import UserInfo
  12. class UserSerializers(serializers.ModelSerializer):
  13.     """用户收货地址"""
  14.     class Meta:
  15.         model = UserInfo
  16.             # 所有字段
  17.         #fields = '__all__'
  18.         fields = ['name', 'code', 'title',  'province', 'city',
  19.                     'quxian', 'address', 'code__gte', 'code__lte']
  20.         # 显示外键
  21.         depth = 2
  22. # views.py
  23. class MachineViews(APIView):
  24.     def get(self, request, *args, **kwargs):
  25.         # 从前端获取出来的过滤参数,解析成字典传进filter()函数中
  26.         # 动态过滤,
  27.         kwargs = {}
  28.         # 表中的字段名
  29.         columns = ['name', 'code', 'title',  'province', 'city',
  30.                     'quxian', 'address', 'code__gte', 'code__lte']
  31.         for k, v in request.query_params.items():
  32.             if k not in columns:
  33.                 return Response('参数不对', status=status.HTTP_400_BAD_REQUEST)
  34.                         if v:
  35.                     kwargs[k] = v
  36.         users = UserInfo.objects.filter(**kwargs)
  37.         page = UserPagination()
  38.         page_goods_list = page.paginate_queryset(users, self.request, self)
  39.         ser = UserSerializers(page_goods_list, many=True)
  40.         return page.get_paginated_response(ser.data)
复制代码
15、linux后台运行python程序
  1. nohup /home/project_venv/user/bin/python3 -u /home/user/user_server.py >> /home/user/user.log 2>&1 &
复制代码
16、追加外键
  1. ALTER TABLE tb_commentPhoto ADD CONSTRAINT FK_comment_phone
  2. FOREIGN KEY tb_goodsComment(id) REFERENCES tb_commentPhoto(comment_id);
复制代码
17、写/读CSV文件,查看是否存在,若存在就从csv中删除
  1. import csv
  2. import random
  3. import string
  4. def create_invite_code(random_code_pool=None, length=6, num=10, is_append=False):
  5.     """
  6.     创建随机邀请码,并写入txt文件
  7.     :param: random_code_pool 随机邀请码
  8.     :param: length 邀请码长度
  9.     :param: num 邀请码个数
  10.     :param: is_append True追加,False 覆盖
  11.     :return:
  12.     """
  13.     if not random_code_pool:
  14.         code_pool = string.ascii_uppercase + string.digits
  15.         random_code_pool = []
  16.         for i in range(num):
  17.             s = ''
  18.             for _ in range(length):
  19.                 s += random.choice(code_pool)
  20.             if s and s not in random_code_pool:
  21.                 random_code_pool.append(s)
  22.     # 写入方法。是追加还是覆盖
  23.     write_method = 'a+' if is_append else 'w'
  24.     # 写入文件
  25.     with open('./invite_code.csv', write_method, newline='') as f:
  26.         writer = csv.writer(f)
  27.         for rowData in random_code_pool:
  28.             # 按行写入
  29.             writer.writerow((rowData,))
  30. def check_invite_code(code):
  31.     """
  32.     查看邀请码是否存在txt文件中,
  33.     若存在就返回True,并在txt文件中删除
  34.     若不存在就返回False
  35.     :param code:
  36.     :return:
  37.     """![img](https://img2023.cnblogs.com/blog/2959648/202301/2959648-20230114201949035-1110575174.png)
  38.     code_pool = []
  39.     with open('./invite_code.csv', 'r', encoding='utf-8',errors='ignore') as f:
  40.         allFileInfo = csv.reader(f)
  41.         for row in allFileInfo:
  42.             code_pool.append(row[0])
  43.     if code in code_pool:
  44.         # 删除查询的code
  45.         code_pool.pop(code_pool.index(code))
  46.         # 重新写入文件
  47.         create_invite_code(code_pool,is_append=False)
  48.         return True
  49.     return False
  50. if __name__ == '__main__':
  51.     # create_invite_code(length=9,num=100)
  52.     print(check_invite_code('WJ4PSTJG2'))
复制代码
18、django中从request获取访问路径
  1. print('获取相对路径', request.get_full_path())
  2. print('获取绝对路径', request.build_absolute_uri())
  3. print(request.build_absolute_uri('?'))
  4. print(request.build_absolute_uri('/')[:-1].strip("/"))
  5. print(request.build_absolute_uri('/').strip("/"))
  6. print(request.build_absolute_uri('/'))
  7. print('----------')
  8. print(request.META['HTTP_HOST'])
  9. print(request.META['PATH_INFO'])
  10. print(request.META['QUERY_STRING'])
  11. iphost = request.META.get('REMOTE_ADDR', '')  # 获取访问来源IP
  12. # 输出如:
  13. 获取相对路径 /QRcode/?d=1
  14. 获取绝对路径 http://127.0.0.1:8000/QRcode/?d=1
  15. http://127.0.0.1:8000/QRcode/
  16. http://127.0.0.1:8000
  17. http://127.0.0.1:8000
  18. http://127.0.0.1:8000/
  19. ----------
  20. 127.0.0.1:8000
  21. /QRcode/
  22. d=1
复制代码
19、Django收集静态文件
  1. 先在项目根目录下创建一个static文件夹
  2. 然后在settings.py中设置
  3. STATIC_ROOT = os.path.join(BASE_DIR, 'static')
  4. 最后执行下面的命令:
  5. python manage.py collectstatic
复制代码
20、xadmin插件

https://www.cnblogs.com/lanqie/p/8340215.html
21、uwsgi自动重启
  1. [uwsgi]
  2. # 使用nginx连接时 使用
  3. socket=0.0.0.0:2019
  4. # 直接作为web服务器使用
  5. #http=0.0.0.1:8000
  6. # 配置工程目录
  7. chdir=/home/user
  8. # 配置项目的wsgi目录。相对于工程目录
  9. wsgi-file=user/wsgi.py
  10. virtualenv=/home/project_venv/user
  11. #配置进程,线程信息
  12. processes=1
  13. threads=1
  14. enable-threads=True
  15. master=True
  16. pidfile=uwsgi.pid
  17. daemonize=uwsgi.log
  18. #启动uwsgi的用户名和用户组
  19. uid=root
  20. gid=root
  21. #uwsgi自动重启
  22. py-autoreload=1
复制代码
22、谷歌浏览器快捷键
  1. 浏览器缓存
  2. Ctrl+Shift+Del  清除Google浏览器缓存的快捷键
  3. Ctrl+Shift+R  重新加载当前网页而不使用缓存内容
复制代码
23、git克隆分支
  1. git clone -b dev 地址
复制代码
24、mysql更新语句、新增列、删除列
  1. update user set name='张三' where id=111
  2. # 删除
  3. DELETE FROM table_name [WHERE Clause]
  4. # 增加字段
  5. alter table 表名 add column 列名 类型;
  6. # 删除字段
  7. alter table 表名 dropcolumn 列名 ;
复制代码
25、删除指定格式的文件
  1. import os
  2. import re
  3. def remove_specified_format_file(file_dir, format_name):
  4.     """
  5.     删除指定格式的文件
  6.     :param file_dir: 文件根目录
  7.     :param format_name: 格式
  8.     :return:
  9.     """
  10.     for root, dirs, files in os.walk(file_dir):
  11.         # print(root) #当前目录路径
  12.         # print(dirs) #当前路径下所有子目录
  13.         # print(files) #当前路径下所有非目录子文件
  14.         for file in files:
  15.             if re.match(format_name, file):
  16.                 print(os.path.join(root, file))
  17.                 os.remove(os.path.join(root, file))
  18. remove_specified_format_file(r'D:\学习\LDC\java', r'\._*')
复制代码
26、计算文件总数
  1. import os
  2. def file_count(file_dir):
  3.     """
  4.     :param file_dir: 文件根目录
  5.     :return:
  6.     """
  7.     count = 0
  8.     for root, dirs, files in os.walk(file_dir):
  9.         # print(root) #当前目录路径
  10.         # print(dirs) #当前路径下所有子目录
  11.         # print(files) #当前路径下所有非目录子文件
  12.         count += len(files)
  13.     return count
  14. print(file_count(r'D:\学习\LDC\java\Java学习\newEstore\estore\js'))
复制代码
27、计算文件夹大小
  1. import os
  2. def file_size(file_dir):
  3.     """
  4.     删除指定格式的文件
  5.     :param file_dir: 文件根目录
  6.     :return:
  7.     """
  8.     size = 0
  9.     for root, dirs, files in os.walk(file_dir):
  10.         # print(root) #当前目录路径
  11.         # print(dirs) #当前路径下所有子目录
  12.         # print(files) #当前路径下所有非目录子文件
  13.         for file in files:
  14.             size += os.path.getsize(os.path.join(root, file))
  15.         # M为单位
  16.     return size / 1024 / 1024
  17. file_name = r'D:\学习'
  18. print(file_size(file_name))
复制代码
28、Django实现jsonp跨域
  1. # html
  2. $.ajax({
  3.                     url: '请求路由',
  4.                     type: 'GET',
  5.                     dataType: 'JSONP',
  6.                     data:{
  7.                       code: 'yes',
  8.                     },
  9.                     jsonp: 'callback',
  10.                     success: function(res) {
  11.                        var selectData = $.parseJSON(res);
  12.                        alert(selectData);
  13.                     },
  14.                     error: function(err) {
  15.                     }
  16.                 })
  17. # views.py
  18. def get(self, request, *args, **kwargs):
  19.         code = request.GET.get('code', '')
  20.         # 跨域请求
  21.         callback = request.GET.get('callback', '')
  22.         return HttpResponse("%s('%s')" % (callback, json.dumps({'code': code})), status=status.HTTP_200_OK)
  23. cors解决跨域
  24. https://www.cnblogs.com/wxiaoyu/p/9578848.html
复制代码
29、微信获取用户信息

参考:https://blog.csdn.net/weixin_39735923/article/details/79202563
30、uwsgi初始配置问题

https://blog.csdn.net/weixin_39735923/article/details/79202563
31、django中drf序列化
  1. # 序列化器
  2. class MsgSerializers(serializers.ModelSerializer):
  3.     addtime = serializers.DateTimeField(read_only=True, format="%Y-%m-%d %H:%M:%S")
  4.     hasread = serializers.CharField(source='get_hasread_display')
  5.     msgtype = serializers.CharField(source='get_msgtype_display')
  6.     class Meta:
  7.         model = MallMsg
  8.         # 可以混合使用
  9.         fields = '__all__'  # '__all__' 所有字段
  10.         # 数据库层级控制(序列化链表操作)
  11.         # depth = 1  # 外键层级
  12. #分页器
  13. from rest_framework.pagination import PageNumberPagination
  14. class MyLimitOffsetPagination(PageNumberPagination):
  15.     page_size = 3  # 默认的页面数据数量
  16.     page_query_param = 'page'  # 定制取数据页码key ?
  17.     page_size_query_param = 'page_size'  # 默认取数据页码key &
  18.     max_page_size = 15  # 数据每页取值的最大上限
复制代码
32、第三方库
  1. 安装openssl
  2. pip3 install pyOpenSSL
复制代码
33、requests请求https携带CA证书
  1. import OpenSSL
  2. import requests
  3. import urllib3.contrib.pyopenssl
  4. urllib3.contrib.pyopenssl.inject_into_urllib3()
  5. def p12_to_pem(certname, pwd):
  6.     """
  7.     从.p12文件中提取pem
  8.     :param certname:
  9.     :param pwd:
  10.     :return:
  11.     """
  12.     pem_name = certname + ".pem"
  13.     f_pem = open(pem_name, 'wb')
  14.     p12file = certname + ".p12"
  15.     p12 = OpenSSL.crypto.load_pkcs12(open(p12file, 'rb').read(), pwd)
  16.     f_pem.write(OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, p12.get_privatekey()))
  17.     f_pem.write(OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, p12.get_certificate()))
  18.     ca = p12.get_ca_certificates()
  19.     if ca is not None:
  20.         for cert in ca:
  21.             f_pem.write(OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, cert))
  22.     f_pem.close()
  23.     return pem_name
  24. def post_cert_request(url, data,header, certname, pwd):
  25.     """
  26.     使用证书发起https请求
  27.     :param url:
  28.     :param data:
  29.     :param certname:
  30.     :param pwd:
  31.     :return:
  32.     """
  33.     if (certname != ""):
  34.         cert = p12_to_pem(certname, pwd)
  35.     else:
  36.         cert = None
  37.     r = requests.post(url, header=header, data=data, cert=cert)
  38.     return r
复制代码
34、django创建缓存命令
  1. python manage.py createcachetable 缓存表名
复制代码
35、Django 更改超级用户密码
  1. 在工程文件目录下敲入:
  2. python manage.py shell
  3. 再在python交互界面输入:
  4. from django.contrib.auth.models import User
  5. user = User.objects.get(username = '用户名')
  6. user.set_password('密码')
  7. user.save()
复制代码
36、restframe使用缓存

https://blog.csdn.net/Odyssues_lee/article/details/80872586
37、数据库
  1. select * from user  where ISNULL(code)
  2. update user set code='111',info='微信' where ISNULL(code)
复制代码
38、linux常用命令[[Linux]]
  1. tail -f 日志名  实时监控日志
  2. tail -f 80_v10.log
  3. netstat -na|grep 80  查看端口tcp连接数
  4. netstat -na|grep 80 | wc -l 计算端口tcp连接数
  5. ps -ef|grep python  查看有多少python程序在运行
  6. gunzip 2015.csv.gz   # 解压
  7. unzip 19.zip # 解压zip
  8. wc -l 2015.csv   # 查看行数
  9. apt install lrzsz  # 安装
  10. sz 文件名  # 下载文件
  11. 查找文件
  12. find / -name 文件名
  13. 匹配执行过的以find为开头的命令
  14. history | grep find
复制代码
39、xadmin禁止增加、删除
  1. # models.py
  2. # 用户管理
  3. class UserManage(models.Model):
  4.     name = models.CharField(max_length=20, verbose_name='用户名')
  5.     phone = models.CharField(max_length=11, unique=True, verbose_name='手机号')
  6.     code = models.CharField(max_length=11, unique=True, verbose_name='编号')
  7.     user = models.ForeignKey(User, on_delete=models.CASCADE, editable=False, null=True, verbose_name='管理员')
  8. # adminx.py
  9. # 用户列表
  10. class UserAdmin(object):
  11.     list_display = [ 'code', 'phone', 'name',]
  12.     search_fields = ['code', 'phone']
  13.     list_filter = ['code', 'phone']
  14.     list_editable = ['name']  # 数据即时编辑
  15.     readonly_fields = ['code', 'phone', 'name']  # 只读字段,不能编辑
  16.     model_icon = 'fa fa-square'
  17.     model = UserInfo
  18.     def has_delete_permission(self, *args, **kwargs):
  19.             # 禁止删除
  20.         if args:
  21.             return True
  22.         return False
  23.         def has_add_permission(self,*args,**kwargs):
  24.                 # 禁止增加
  25.         return False
  26.     def save_models(self):
  27.             # 用户级别设置
  28.         self.new_obj.user = self.request.user
  29.         flag = self.org_obj is None and 'create' or 'change'
  30.         if flag == 'create':
  31.                 # 对密码字段进行加密
  32.             self.new_obj.password = encrypt_oracle(self.new_obj.password)
  33.         elif flag == 'change':
  34.             if 'password' in self.change_message():
  35.                 self.new_obj.password = encrypt_oracle(self.new_obj.password)
  36.         else:
  37.                 pass
  38.         super().save_models()
  39. xadmin.site.register(UserInfo, UserAdmin)
复制代码
40、时间格式字符串相减
  1. import datetime
  2. import time
  3. start = str(datetime.datetime.now())[:19]
  4. time.sleep(60)
  5. end = str(datetime.datetime.now())[:19]
  6. print(start,end)
  7. link_start = datetime.datetime.strptime(start, '%Y-%m-%d %H:%M:%S')
  8. link_end = datetime.datetime.strptime(end, '%Y-%m-%d %H:%M:%S')
  9. link_min = round((link_end - link_start).seconds / 60, 2)
  10. print(link_min,'分钟')
复制代码
41、显示循环进度条

参考:https://blog.csdn.net/zejianli/article/details/77915751
  1. from tqdm import tqdm,trange
  2. from time import sleep
  3. text = ""
  4. for char in tqdm(["a", "b", "c", "d"]):
  5.     text = text + char
  6.     sleep(1)
  7. # 方式二
  8. import time
  9. def process_bar(percent, index, total,start_time, start_str='', end_str='', total_length=100):
  10.     # 进度条
  11.     percent_length = int(percent)
  12.     bar = '\r' + start_str + ('\033[1;31;41m \033[0m' * percent_length + '\033[1;37;47m \033[0m' * (
  13.                 total_length - percent_length)) + f'  {round(index / total * 100, 2)}%  ' + f' {index}|{end_str}'+ f'   |已进行时间: {round(time.time() - start_time, 2)}秒'
  14.     print(bar, end='', flush=True)
  15. if __name__ == '__main__':
  16.     data_set = [i for i in range(23)]
  17.     i = 0
  18.     start_time = time.time()
  19.     total = len(data_set)
  20.     end_str = '{}'.format(total)
  21.     for data in data_set:
  22.         time.sleep(1)
  23.         i += 1
  24.         process_bar(i * 100 / total, i, total, start_time, start_str='', end_str=end_str, total_length=100)
  25. # 方式三
  26. import sys
  27. import time
  28. d = [i for i in range(100)]
  29. for i in range(len(d)):
  30.     time.sleep(1)
  31.     sys.stdout.write('\r>> Downloading  %.2f%%' % (float(i) / float(len(d)) * 100.0))
  32. sys.stdout.flush()
复制代码
42、把列表中的字典转成csv文件
  1. import pandas as pd
  2. lists = [{'a':1,'b':2},{'a':2,'b':3}]
  3. df = pd.DataFrame(lists)
  4. print(df)
  5. df.to_csv('result2.csv')
复制代码
43、windows添加右键新建MarkDown文件

在网上下载Typora软件安装后
1、在桌面上新建一个txt文件,输入以下内容:
  1. Windows Registry Editor Version 5.00
  2. [HKEY_CLASSES_ROOT\.md\ShellNew]
  3. "NullFile"=""
  4. "FileName"="template.md"
复制代码
2、另存为,改后缀为.reg,保存类型为.txt,编码为Unicode

3、双击运行,确定,重启电脑,此时在桌面右键就有了新建md文件
44、redis设置值定时过期
  1. import datetime
  2. import redis
  3. redis_client = redis.Redis(
  4.     host='127.0.0.1',
  5.     port=6379,
  6.     db=0,
  7.     password='123456'
  8. )
  9. def redis_set():
  10.     """
  11.     redis设置值定时过期
  12.     :return:
  13.     """
  14.     global redis_client
  15.     redis_client.set('name','ldc')
  16.     now = datetime.datetime.now()
  17.     # 设置‘name’50秒过期
  18.     expire_time = now + datetime.timedelta(hours=0, minutes=0, seconds=50)
  19.     redis_client.expireat('name', expire_time)
  20. if __name__ == '__main__':
  21.     redis_set()
复制代码
45、linux根据端口杀进程
  1. import os
  2. def killport(port):
  3.     command = '''kill -9 $(netstat -nlp | grep :''' + str(port) + ''' | awk '{print $7}' | awk -F"/" '{ print $1 }')'''
  4.     os.system(command)
  5. # 开始执行
  6. if __name__ == '__main__':
  7.     port = 4237
  8.     killport(port)
复制代码
46、监控linux网络流量
  1. iftop -n -N -i eth0
  2. nethogs eth0
  3. vim +/字符串 文件
复制代码
47、win10添加右键打开cmd

通过添加注册表项实现
win + r 输入 regedit
找到注册表位置:HKEY_CLASSES_ROOT\Directory\Background\shell\
右键“shel”l,新建“项”,命名为“以管理员身份打开cmd”,
右键“以管理员身份打开cmd”,新建“DWORD(32位)值”,命名为"ShowBasedOnVelocityId",值为“639bc8”
右键“以管理员身份打开cmd”,新建“项”,命名为“command”
右键“command”,点击“默认”,点击“修改”,填写数值为 cmd.exe /s /k pushd “%V”
48、xadmin后台无法显示下拉框完整内容

解决方案 在根目录中找到/static/xadmin/vendor/selectize/selectize.bootstrap3.css
在331行后加入 position: static;

49、xadmin单点登录

使用中间件实现。
新建一个utils.py文件,存放以下代码:
  1.     from django.contrib.sessions.models import Session
  2.     from django.db.models import Q
  3.     from django.utils import timezone
  4.     from django.utils.deprecation import MiddlewareMixin
  5.     class XadminMiddleware(MiddlewareMixin):
  6.         def process_request(self, request):
  7.             """xadmin后台单点登录"""
  8.             PATH_INFO = request.META.get('PATH_INFO', '')
  9.             if PATH_INFO and 'xadmin' in PATH_INFO:
  10.                 request.session.clear_expired()   # 清除过期的key
  11.                 session_key = request.session.session_key
  12.                 for session in Session.objects.filter(~Q(session_key=session_key), expire_date__gte=timezone.now()):
  13.                     data = session.get_decoded()
  14.                     if data.get('_auth_user_id', None) == str(request.user.id):
  15.                         session.delete()
复制代码
然后在urls.py中设置:
  1.     urlpatterns = [
  2.     ...
  3.     re_path('^xadmin/', xadmin.site.urls),
  4.     ...
  5.     ]
复制代码
然后在settings.py中注册中间件
  1.     MIDDLEWARE = [
  2.     ...
  3.     'utils.xadminauth.XadminMiddleware',
  4.     ...
  5.     ]
  6.         SESSION_COOKIE_AGE = 1209600  # 设置过期时间
  7.     SESSION_SAVE_EVERY_REQUEST = Ture  # 每次请求都更新
复制代码
【参考】 https://blog.csdn.net/Python_anning
50、Django restful 多个models数据表序列化合并返回(一次请求返回多个序列化器数据)
  1. # 导入第三方包
  2. pip install django-crispy-forms==1.7.2
  3. # 在settings.py中添加应用
  4. INSTALLED_APPS = [
  5. ...
  6. 'drf_multiple_model',
  7. 'rest_framework',
  8. ...
  9. ]
  10. # 在views.py中使用
  11.     from drf_multiple_model.pagination import MultipleModelLimitOffsetPagination
  12.     from drf_multiple_model.views import ObjectMultipleModelAPIView
  13.     class LimitPagination(MultipleModelLimitOffsetPagination):
  14.         # 多个models数据表联合查询,分页,每页限制数据10条
  15.         default_limit = 10
  16.     class StudentSerializers(serializers.ModelSerializer):
  17.         """学生表序列化器"""
  18.         # merchant = MerchantSerializers()
  19.         register_time = serializers.DateTimeField(read_only=True, format="%Y-%m-%d %H:%M:%S")
  20.         class Meta:
  21.             model = Student
  22.             fields = '__all__'
  23.     class ClassesSerializers(serializers.ModelSerializer):
  24.         """班级表序列化器"""
  25.         # merchant = MerchantSerializers()
  26.         add_time = serializers.DateTimeField(read_only=True, format="%Y-%m-%d %H:%M:%S")
  27.         class Meta:
  28.             model = Classes
  29.             fields = '__all__'
  30.     class SchoolSerializers(serializers.ModelSerializer):
  31.         """学校表序列化器"""
  32.         # merchant = MerchantSerializers()
  33.         add_time = serializers.DateTimeField(read_only=True, format="%Y-%m-%d %H:%M:%S")
  34.         class Meta:
  35.             model = School
  36.             fields = '__all__'
  37.     class StudentInfo(ObjectMultipleModelAPIView):
  38.         # 获取学生信息,班级信息,学校信息
  39.         def get(self, request, *args, **kwargs):
  40.             uid = request.GET.get('uid', '')  # 学生id
  41.             cid = request.GET.get('cid', '')  # 班级id
  42.             sid = request.GET.get('sid', '')  # 学校id
  43.             self.querylist = [
  44.                 {'queryset': Student.objects.filter(id=uid).order_by('-id'),
  45.                     'serializer_class':  StudentSerializers, 'label': 'student', },
  46.                 {'queryset': Classes.objects.filter(id=cid).order_by('-id'),
  47.                     'serializer_class':  ClassesSerializers, 'label': 'classes', },
  48.                 {'queryset': School.objects.filter(id=sid).order_by('-id'),
  49.                     'serializer_class':  SchoolSerializers, 'label': 'school', },
  50.             ]
  51.             return self.list(request, *args, **kwargs)
  52.         pagination_class = LimitPagination
复制代码
51、 Django序列化器返回外键关联数据

通过 related_name='goods_price’把两个表关联起来,当返回Goods的信息时也会返回相应的GoodsPrice信息
  1.     class GoodsPriceSerializers(serializers.ModelSerializer):
  2.         """商品价格表序列化器"""
  3.         class Meta:
  4.             model = GoodsPrice
  5.             fields = ['price']
  6.     class GoodsSerializers(serializers.ModelSerializer):
  7.         """商品表序列化器"""
  8.         goods_price = GoodsPriceSerializers(many=True, read_only=True)
  9.         class Meta:
  10.             model = Goods
  11.             fields = ['title','goods_price']
  12.             depth = 2
  13.     class Goods(models.Model):
  14.         """商品表"""
  15.         title = models.CharField(max_length=50, verbose_name='商品名称')
  16.         class Meta:
  17.             db_table = 'goods'
  18.             verbose_name = '商品信息表'
  19.             verbose_name_plural = verbose_name
  20.         def __str__(self):
  21.             return self.title
  22.     class GoodsPrice(models.Model):
  23.         """商品价格表,通过外键关联商品信息表"""
  24.         price = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name='售价')
  25.         goods = models.ForeignKey(to='Goods', related_name='goods_price', on_delete=models.SET_NULL, blank=True, null=True,verbose_name='商品')
  26.         def __str__(self):
  27.             return str(self.price)
  28.         class Meta:
  29.             managed = True
  30.             db_table = 'goodsPrice'
  31.             verbose_name = '商品售价'
  32.             verbose_name_plural = verbose_name
复制代码
52、python Django通过User Agent判断请求来源是微信扫一扫或者是支付宝扫一扫
  1.     class Footest(APIView):
  2.             def get(self, request, *args, **kwargs):
  3.                 # print(request.META)
  4.                 if 'MicroMessenger' in request.META['HTTP_USER_AGENT']:
  5.                     return Response(data={'msg': '访问来源是微信'})
  6.                 elif 'AlipayClient' in request.META['HTTP_USER_AGENT']:
  7.                     return Response(data={'msg': '访问来源是支付宝'})
  8.                 else:
  9.                     return Response(data={'msg': '访问来源是其他'})
复制代码
User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
浏览器的 UA 字串
标准格式为: 浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识 版本信息
获取user-Agent 之后,
通过识别MicroMessenger或者AlipayClient这样的关键字应该就可以判断是微信还是支付宝
【参考文章】 https://blog.csdn.net/fly910905/article/details/82498813?utm_source=blogxgwz4
53、xadmin后台集成’导入‘插件,导入excel文件

效果图:

1、添加
在虚拟环境根目录\Lib\site-packages\xadmin\plugins中添加excel.py文件
  1. from xadmin.views import BaseAdminPlugin, ListAdminView
  2.     from django.template import loader
  3.     import xadmin
  4.     class ListExcelImportPlugin(BaseAdminPlugin):
  5.         # 重写init_request
  6.         import_excel = False
  7.         def init_request(self, *args, **kwargs):
  8.             return self.import_excel
  9.         def block_top_toolbar(self, context, nodes):
  10.             # 这里 xadmin/excel/model_list.top_toolbar.import.html 是自己写的html文件
  11.           nodes.append(loader.render_to_string("xadmin/excel/model_list.top_toolbar.import.html"))
  12.     xadmin.site.register_plugin(ListExcelImportPlugin, ListAdminView)
复制代码
在虚拟环境根目录\Lib\site-packages\xadmin\plugins__init__.py中
  1. PLUGINS = (
  2.     ...
  3.         'excel',
  4.     ...
  5.     )
复制代码
2、添加html文件

在虚拟环境根目录\Lib\site-packages\xadmin\templates\xadmin\中增加文件夹excel,在文件夹中添加model_list.top_toolbar.import.html文件
  1. {% load i18n %}
  2.    
  3.         <a  data-toggle="dropdown" target="_blank" href="https://www.cnblogs.com/#">
  4.             <i ></i> 导入数据
  5.         </a>
  6.         <ul  role="menu" aria-labelledby="dLabel">
  7.             <li><a data-toggle="modal" data-target="#export-modal-import-excel"><i ></i> 导入
  8.                 Excel</a></li>
  9.         </ul>
  10.         
  11.             
  12.                
  13.                     <form method="post" action="" enctype="multipart/form-data">
  14.                         
  15.                         
  16.                             <button type="button"  data-dismiss="modal" aria-hidden="true">×</button>
  17.                             <h4 >导入 Excel</h4>
  18.                         
  19.                         
  20.                             <input type="file" onchange="fileChange(this)" name="excel" id="submit_upload">
  21.                         
  22.                         
  23.                             <button type="button"  data-dismiss="modal">{% trans "Close" %}</button>
  24.                             <button  type="button" id="submit_upload_b"><i ></i> 导入
  25.                             </button>
  26.                         
  27.                     </form>
  28.                
  29.             
  30.         
  31.    
  32.    
复制代码
3、在views.py处理上传的excel文件
  1. import pandas as pd
  2.     from rest_framework.views import APIView
  3.     class ImportKDOrderNo(APIView):
  4.         def post(self, request, *args, **kwargs):
  5.             file = request.FILES.get('file')
  6.             # read = InMemoryUploadedFile().open()
  7.             data = pd.read_excel(file)  # 使用pandas处理excel文件
  8.                     file_source = request.POST.get('file_source', '')  # 文件来源
  9.             if '订单号' and '物流单号' not in data:
  10.                 return Response(data={'msg': '文件格式有误,第一行第一列应该为【订单号】,第一行第二列应该为【物流单号】'})
  11.             ordernos = data['订单号']
  12.             logistics = data['物流单号']
  13.             for i in range(len(ordernos)):
  14.                 print('订单号', ordernos[i], '物流单号', logistics[i])
  15.             return Response(data={'msg': '上传成功'})
复制代码
4、在urls.py中添加访问路由
  1. from django.urls import path
  2. from 你的应用名称 import views
  3. app_name = '你的应用名称'
  4. urlpatterns = [
  5.     # 其他路由
  6.     ...
  7.     # 导入物流单号
  8.     path('importkdorderno/', views.ImportKDOrderNo.as_view(), name='importkdorderno'),
  9. ]
复制代码
54、Django中查找今天进账金额

views.py
  1. from datetime import datetime
  2.     class CountFee(APIView):
  3.             def get(self, request, *args, **kwargs):
  4.                     # 获取当前时间的年月日,然后使用聚合函数添加fee字段的值
  5.                 year = datetime.now().year
  6.             month = datetime.now().month
  7.             day = datetime.now().day
  8.             count_fees = FeeDetail.objects.filter(addtime__year=year, addtime__month=month, addtime__day=day).aggregate(Sum('fee'))
  9.             all_fee = count_fees['fee__sum'] if count_fees['fee__sum'] else 0
  10.             print(all_fee)
  11.             return Response({'code': 1, 'msg': 'success', 'data': {'all_fee': all_fee}})
复制代码
55、判断是什么系统
  1. import platform
  2. PlATFORM = platform.system()
  3. if PlATFORM == "Linux":
  4.     print('linux')
  5. else:
  6.     print('其他')
复制代码
56、sql查询
  1. # 联合更新
  2. update malluser set master_master_id=3 where master_id in (select a.id from (select id from  malluser where id like '15%')a)
  3. # 统计某字段重复数据
  4. SELECT phone, COUNT(*) AS sumCount FROM malluser GROUP BY phone HAVING sumCount > 1;
复制代码
57、 xadmin后台删除数据出现错误
  1. get_deleted_objects() takes 3 positional arguments but 5 were given
复制代码
这是由于Django2.1版本和xadmin不兼容导致的
知道虚拟环境\Lib\site-packages\xadmin\plugins\actions.py
修改93行,
  1. deletable_objects, model_count, perms_needed, protected = get_deleted_objects(
  2.             queryset, self.opts, self.user, self.admin_site, using)
复制代码
改为
  1. deletable_objects, model_count, perms_needed, protected = get_deleted_objects(
  2.             queryset, self.user, self.admin_site)
复制代码
然后在adminx.py文件中对应的模型类中允许删除
  1. class MaterialAdmin(object):
  2.     """素材库分类"""
  3.     list_display = ['id', 'name', 'class_id', 'is_delete', 'addtime']
  4.     def has_delete_permission(self, *args, **kwargs):
  5.         return True
复制代码
58、xdamin限制用户点击
  1. //如果登录z=xadmin后台的账号不是【root】的就不能点击更新操作
  2.     var master_name = $('#top-nav').find('strong').text();
  3.         master_name =  master_name.substring(4);
  4.     if(master_name != 'root'){
  5.             $(".grid-item a").each(function(index, element) {
  6.                 $(this).attr('href','#');
  7.             });
  8.         }
复制代码
59、获取公众号关注url

在微信网页版,打开公众号,点击右上角“…”,在弹框中选择右下角中间的“查看历史记录”,然后在弹框中选择左上角倒数第一个,“用默认浏览器打开”,就可以在打开的浏览器中获取该公众号的关注url,当把这个url发给好友时,好友点开的就是去关注公众号的页面。
60、xadmin后台用户操作表权限

虚拟环境根目录\Lib\site-packages\xadmin\views\base.py
可以找到:

在项目子应用下的adminx.py中使用
  1.     import xadmin
  2.     from machine.models import Machine
  3.     class MachineAdmin(object):
  4.         list_display = ['code',]  # 显示的字段
  5.         search_fields = ['code']  # 搜索的字段
  6.         list_filter = ['code', 'is_delete'] # 过滤的字段
  7.         ordering = ('-id',) # 按id降序排序
  8.         list_editable = ['is_delete', ]  # 数据即时编辑
  9.         list_per_page = 30  # 每页显示数据数量
  10.         model_icon = 'fa fa-cog fa-spin'  # 左侧显示的小图标
  11.         def has_delete_permission(self, *args, **kwargs):
  12.             # 删除权限
  13.             if self.request.user.is_superuser:  # 管理员才能增加
  14.                 return True
  15.             return False
  16.         def has_add_permission(self, *args, **kwargs):
  17.             if self.request.user.is_superuser:  # 管理员才能增加
  18.                 return True
  19.             return False
  20.         def has_change_permission(self, *args, **kwargs):
  21.             if self.request.user.is_superuser: # 管理员才能修改
  22.                 return True
  23.             return False
  24.         def queryset(self):
  25.             qs = super(MachineAdmin, self).queryset()
  26.             if self.request.user.is_superuser:  # 管理员可以查看所有
  27.                 return qs
  28.             else:
  29.                 # 登录用户只能看到自己修改的数据
  30.                 return qs.filter(master_id=self.request.user.last_name)
  31.     xadmin.site.register(MallMachine, MallMachineAdmin)
复制代码
61、使用nginx部署项目

先在/etc/nginx/sites-available中创建一个配置文件,文件名为test(注意没有后缀):
  1.     #设定虚拟主机配置
  2.         server {
  3.             #侦听80端口
  4.             listen 80;
  5.             listen 443 ssl;
  6.             #定义使用 www.nginx.cn访问
  7.                     #ssl on;
  8.             server_name  xxx.xxx.com;
  9.             #定义服务器的默认网站根目录位置
  10.             root /root/项目名称;
  11.                     ssl_session_timeout 5m;
  12.             ssl_certificate   /etc/nginx/cert/xxx.pem;
  13.             ssl_certificate_key  /etc/nginx/cert/xxx.key;
  14.             ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  15.             ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  16.             ssl_prefer_server_ciphers on;
  17.             #设定本虚拟主机的访问日志
  18.             #access_log  logs/nginx.access.log  main;
  19.             #默认请求
  20.             location / {
  21.                 #倒入了uwsgi的配置
  22.                 include uwsgi_params;
  23.                         client_max_body_size        50m;
  24.                 #连接uwsgi的超时时间
  25.                # uwsgi_connect_timeout 30;
  26.                  #设定了uwsig服务器位置
  27.                          uwsgi_pass 127.0.0.1:8002;
  28.             }
  29.             location /static{
  30.                   alias /root/项目名称/static;
  31.             }
  32.             location /media {
  33.             alias /root/项目名称/media;
  34.             }
  35.     }
复制代码
其中xxx.xxx.com表示域名.如果没有https,就使用#把ssl注释掉就可以了。
然后把test映射到/etc/nginx/sites-enabled
命令
  1.     ln -s /etc/nginx/sites-available/test /etc/nginx/sites-enabled/test
复制代码
即可
注意:
uwsgi中配置listen=1024时,启动uwsgi时可能会报错:
  1. django + uwsgi + nginx 日志Listen queue size is greater than the system max net.core.somaxconn (128).
复制代码
解决方法:
  1. 修改系统参数
  2. /proc/sys/net/ipv4/tcp_max_syn_backlog  原来2048    改为8192
  3. /proc/sys/net/core/somaxconn        原来128     改为262144
复制代码
重启nginx
  1. nginx -s reload
复制代码
62、xadmin后台发送邮件找回密码


输入你用户绑定的邮箱

想要发送邮件,需要在settings.py中设置邮件发送器
settings.py最下面增加
  1.     # ------------------------邮箱配置-----------------------------------------
  2.     EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' #把要发送的邮件显示再控制台上,方便调试
  3.     EMAIL_USE_SSL = True
  4.     EMAIL_HOST = 'smtp.qq.com'  # 如果是 163 改成 smtp.163.com
  5.     EMAIL_PORT = 465
  6.     EMAIL_HOST_USER = '邮箱账号' # 帐号
  7.     EMAIL_HOST_PASSWORD = '授权码'  # 到邮箱里开通
  8.     DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
复制代码
由于django2与xadmin有些地方不兼容,需要修改源码:
找到虚拟环境根目录\Lib\site-packages\xadmin\plugins\passwords.py
在passwords.py文件中大概79行,修改为
  1.     return password_reset_confirm(request=request, uidb36=uidb36, token=token,
  2.                                           template_name=self.password_reset_confirm_template,
  3.                                           token_generator=self.password_reset_token_generator,
  4.                                           set_password_form=self.password_reset_set_form,
  5.                                           post_reset_redirect=self.get_admin_url('xadmin_password_reset_complete'),
  6.                                           current_app=self.admin_site.name, extra_context=context).dispatch(request=request,
  7.                                                                                                             uidb64=uidb36,token=token)
复制代码
找到虚拟环境根目录Lib\site-packages\django\contrib\auth\views.py
在views.py文件中大概258行,增加:
  1.     # 成功后跳转路由,根据自己实际来定
  2.     self.success_url = self.request.build_absolute_uri('/') + 'xadmin/'
复制代码

63、xadmin外键下拉框添加过滤
  1. class MallGoodsAdmin(object):
  2.     """商品管理"""
  3.     list_display = ['id', 'show_photo', 'nickname', 'merchant', 'goods_class', 'label',]
  4.     search_fields = ['nickname']
  5.     list_filter = ['goods_class', 'label',]
  6.     model_icon = 'fa fa-bars'
  7.     list_editable = ['goods_class', ]
  8.     #,重写虚拟环境根目录下\Lib\site-packages\xadmin\views\edit.py中的formfield_for_dbfield
  9.     def formfield_for_dbfield(self, db_field, **kwargs):
  10.         # 对MallGoodsClass这个表项的下拉框选择进行过滤
  11.         # MallGoods中有一个goods_class商品分类外键MallGoodsClass,过滤掉外键MallGoodsClass中
  12.         # master_class为空的值
  13.         if db_field.name == "goods_class":
  14.             kwargs["queryset"] = MallGoodsClass.objects.filter(master_class__isnull=False)
  15.             # 对assigned_recipient这个表项的下拉选择进行过滤
  16.                 return db_field.formfield(**dict(**kwargs))
  17.         return super().formfield_for_dbfield(db_field, **kwargs)
  18. xadmin.site.register(models.MallGoods, MallGoodsAdmin)
复制代码
64、xadmin即时编辑器去掉空标签


虚拟环境根目录下\Lib\site-packages\xadmin\plugins\editable.py,在大概
129行增加:
  1.     form.fields[fields[0]].empty_label = None
复制代码

65、用户增加的小组件,让其他用户可见

找到虚拟环境根目录\Lib\site-packages\xadmin\views\dashboard.py
在548行、554行

改为:
  1.     @filter_hook
  2.         def get_widgets(self):
  3.             if self.widget_customiz:
  4.                 portal_pos = UserSettings.objects.filter(
  5.                    key=self.get_portal_key())
  6.                 if len(portal_pos):
  7.                     portal_pos = portal_pos[0].value
  8.                     widgets = []
  9.                     if portal_pos:
  10.                         user_widgets = dict([(uw.id, uw) for uw in UserWidget.objects.filter(page_id=self.get_page_id())])
  11.                         for col in portal_pos.split('|'):
  12.                             ws = []
  13.                             for wid in col.split(','):
  14.                                 try:
  15.                                     widget = user_widgets.get(int(wid))
  16.                                     if widget:
  17.                                         ws.append(self.get_widget(widget))
  18.                                 except Exception as e:
  19.                                     import logging
  20.                                     logging.error(e, exc_info=True)
  21.                             widgets.append(ws)
  22.                     return widgets
  23.             return self.get_init_widget()
复制代码
66、pip install uwsgi出错
  1. plugins/python/uwsgi_python.h:2:20: fatal error: Python.h: No such file or directory
复制代码
首先安装python3环境
  1. apt install python3-dev
复制代码
然后再虚拟环境中
  1. pip install uwsgi
复制代码
66、xadmin后台加载数据慢,解决方案

list_filter: 过滤器要慎用,不要使用类似id这些数据量大的字段
  1.     class MallUserAdmin(object):
  2.         """用户管理"""
  3.         list_display = ['id', 'tp_icon', 'nickname', 'phone', 'level', 'balance', 'province', 'city', 'quxian']  # 显示字段
  4.         search_fields = ['id', 'nickname', 'phone']  # 搜索
  5.         list_filter = ['level', 'province', 'city', 'quxian']  # 过滤器
  6.         # list_filter = ['id', 'level', 'province', 'city', 'quxian']  # 如果加id,xadmin加载回来的数据就会很慢,所以不要在过滤器上使用id
  7.         list_per_page = 30  # 默认每页数量
  8.         model_icon = 'fa fa-users'  # 左侧图标
  9.         ordering = ['-id']  # 排序
  10.         readonly_fields = ['subscribe', 'wx_openid', 'phone']  # 只读字段
  11.         is_addbalance = True   # 加载自定义的插件
  12.         relfield_style = 'fk-ajax'  # 其他表如果外键到用户表就做ajax搜索查询,不一次性加载数据
复制代码
67 、xadmin导出插件处理,增加导出勾选数据项

常规的导出只有两个选择【导出表头】、【导出全部数据】

现在想要做的是增加一个选择,即【导出表头】、【导出全部数据】、【导出勾选数据】,如下图:

需要修改xadmin源代码,具体如下
1、加载js文件

找到虚拟环境\Lib\site-packages\xadmin\views\list.py,在607行增加’xadmin.plugin.importexport.js’,如下图所示

2、修改export.py,后端处理下载文件

找到虚拟环境\Lib\site-packages\xadmin\plugins\export.py
在84行把rows = context[‘results’]修改成如下函数
  1.     # 新增导出所选数据
  2.     # rows = context['results']
  3.     rows = []
  4.     select_across = self.request.GET.get('_select_across', False) == '1'
  5.     selected = self.request.GET.get('_selected_actions', '')
  6.     if self.request.GET.get('selected', 'off') == 'on':
  7.         if not select_across:
  8.             selected_pk = selected.split(',')
  9.             for i in context['results']:
  10.                 if str(i['object'].id) in selected_pk:
  11.                     rows.append(i)
  12.         else:
  13.             rows = context['results']
  14.     else:
  15.         rows = context['results']
复制代码

3、 修改model_list.top_toolbar.exports.html
找到虚拟环境\Lib\site-packages\xadmin\templates\xadmin\blocks\model_list.top_toolbar.exports.html
使用以下代码覆盖原文件
  1.     {% load i18n %}
  2.    
  3.         <a id="export-menu"  data-toggle="dropdown" target="_blank" href="https://www.cnblogs.com/#">
  4.             <i ></i> {% trans "Export" %}
  5.         </a>
  6.         <ul  role="menu" aria-labelledby="dLabel">
  7.             {% for et in export_types %}
  8.             <li><a data-toggle="modal" data-target="#export-modal-{{et.type}}"><i >
  9.             </i> {% trans "Export" %} {{et.name}}</a></li>
  10.             {% endfor %}
  11.         </ul>
  12.         {% for et in export_types %}
  13.         
  14.             
  15.                
  16.                     <form method="get" action="">
  17.                         
  18.                             <button type="button"  data-dismiss="modal" aria-hidden="true">×</button>
  19.                             <h4 >{% trans "Export" %} {{et.name}}</h4>
  20.                         
  21.                         
  22.                             {{ form_params|safe }}
  23.                             <input type="hidden" name="export_type" value="{{et.type}}">
  24.                            
  25.                             <input type="hidden" name="_selected_actions" value=""/>
  26.                             <input type="hidden" name="_select_across" value=""/>
  27.                             <label >
  28.                                 {% if et.type == "xlsx" %}
  29.                                 <input type="checkbox" name="export_xlsx_header" checked="checked" value="on">
  30.                                 {% trans "Export with table header." %}
  31.                                 {% endif %}
  32.                                 {% if et.type == "xls" %}
  33.                                 <input type="checkbox" name="export_xls_header" checked="checked" value="on">
  34.                                 {% trans "Export with table header." %}
  35.                                 {% endif %}
  36.                                 {% if et.type == "csv" %}
  37.                                 <input type="checkbox" name="export_csv_header" checked="checked" value="on">
  38.                                 {% trans "Export with table header." %}
  39.                                 {% endif %}
  40.                                 {% if et.type == "xml" %}
  41.                                 <input type="checkbox" name="export_xml_format" checked="checked" value="on">
  42.                                 {% trans "Export with format." %}
  43.                                 {% endif %}
  44.                                 {% if et.type == "json" %}
  45.                                 <input type="checkbox" name="export_json_format" checked="checked" value="on">
  46.                                 {% trans "Export with format." %}
  47.                                 {% endif %}
  48.                             </label>
  49.                             <label >
  50.                                 <input type="checkbox" name="all" value="on"> {% trans "Export all data." %}
  51.                             </label>
  52.                            
  53.                             <label >
  54.                                 <input type="checkbox" name="selected" value="on"> 导出勾选数据
  55.                             </label>
  56.                         
  57.                         
  58.                             <button type="button"  data-dismiss="modal">{% trans "Close" %}</button>
  59.                             <button  type="submit"><i
  60.                                     ></i> {% trans "Export" %}
  61.                             </button>
  62.                         
  63.                     </form>
  64.                
  65.             
  66.         
  67.         {% endfor %}
  68.    
  69.    
复制代码
68、使用F查询更新用户重要数据
  1.     from django.db.models import F
  2.     # 使用F查询更新用户余额
  3.     balance = 5
  4.     MallUser.objects.filter(id=1).update(balance=F('balance') + balance)
复制代码
相当于sql的
  1.     update Malluser set balance=balance + 5 where id=1;
复制代码
69、日志输出模块
  1.     import logging
  2.     import platform
  3.     # 全局函数
  4.     PlATFORM = platform.system()
  5.     if (PlATFORM == "Linux"):
  6.         # linux系统,文件保存在var下
  7.         SERVER_LOG_PATH = '/var/mylog.log'
  8.     else:
  9.         # windows系统,文件保存在D盘下
  10.         SERVER_LOG_PATH = 'D:\mylog.log'
  11.     # 定义一个logging的对象,命名为mylog
  12.     LOGGER = logging.getLogger('mylog')
  13.     # 设置级别为WARNING
  14.     LOGGER.setLevel(logging.WARNING)
  15.     # 创建一个handler,用于写入日志文件
  16.     fh = logging.FileHandler(SERVER_LOG_PATH, encoding='utf-8')
  17.     fh.setLevel(logging.WARNING)
  18.     # 定义handler的输出格式
  19.     formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
  20.     fh.setFormatter(formatter)
  21.     # 给Logger添加handler
  22.     LOGGER.addHandler(fh)
  23.     # 不在控制台显示
  24.     LOGGER.propagate = False
复制代码
70、字典排序

字典在内存中发布是无序的,当想对键值或者键名进行排序时可以先把字典转成元组,这可以达到排序的目的。
  1. score = {'小明': {'avg_score': 90, 'English': 90, 'Math': 90, 'Chniese': 90, },
  2.      '小红': {'avg_score': 60, 'English': 60, 'Math': 61, 'Chniese': 59, },
  3.      '小黑': {'avg_score': 70, 'English': 75, 'Math': 65, 'Chniese': 70, },
  4.      '小白': {'avg_score': 80, 'English': 95, 'Math': 65, 'Chniese': 80, },
  5.      }
  6. # 对姓名进行排序,即对键名进行排序
  7. b = sorted(score.items(), key=lambda x: x[0], reverse=True)
  8. show_str = ''
  9. for info in b:
  10.     # print(info)
  11.     key, value = info[0], info[1]
  12.     show_str += '姓名:{},平均分:{},成绩:{}'.format(key,value['avg_score'], value) + '\r\n'
  13. print('对姓名进行排序')
  14. print(show_str)
  15. # 对平均分进行排序
  16. b = sorted(score.items(), key=lambda x: x[1]['avg_score'], reverse=True)
  17. show_str = ''
  18. for info in b:
  19.     # print(info)
  20.     key, value = info[0], info[1]
  21.     show_str += '姓名:{},平均分:{},成绩:{}'.format(key,value['avg_score'], value) + '\r\n'
  22. print('对平均分进行排序')
  23. print(show_str)
  24. # 对英语成绩进行排序
  25. b = sorted(score.items(), key=lambda x: x[1]['English'], reverse=True)
  26. show_str = ''
  27. for info in b:
  28.     # print(info)
  29.     key, value = info[0], info[1]
  30.     show_str += '姓名:{},平均分:{},成绩:{}'.format(key,value['avg_score'], value) + '\r\n'
  31. print('对英语成绩进行排序')
  32. print(show_str)
复制代码
输出:
  1. 对姓名进行排序
  2. 姓名:小黑,平均分:70,成绩:{'avg_score': 70, 'English': 75, 'Math': 65, 'Chniese': 70}
  3. 姓名:小红,平均分:60,成绩:{'avg_score': 60, 'English': 60, 'Math': 61, 'Chniese': 59}
  4. 姓名:小白,平均分:80,成绩:{'avg_score': 80, 'English': 95, 'Math': 65, 'Chniese': 80}
  5. 姓名:小明,平均分:90,成绩:{'avg_score': 90, 'English': 90, 'Math': 90, 'Chniese': 90}
  6. 对平均分进行排序
  7. 姓名:小明,平均分:90,成绩:{'avg_score': 90, 'English': 90, 'Math': 90, 'Chniese': 90}
  8. 姓名:小白,平均分:80,成绩:{'avg_score': 80, 'English': 95, 'Math': 65, 'Chniese': 80}
  9. 姓名:小黑,平均分:70,成绩:{'avg_score': 70, 'English': 75, 'Math': 65, 'Chniese': 70}
  10. 姓名:小红,平均分:60,成绩:{'avg_score': 60, 'English': 60, 'Math': 61, 'Chniese': 59}
  11. 对英语成绩进行排序
  12. 姓名:小白,平均分:80,成绩:{'avg_score': 80, 'English': 95, 'Math': 65, 'Chniese': 80}
  13. 姓名:小明,平均分:90,成绩:{'avg_score': 90, 'English': 90, 'Math': 90, 'Chniese': 90}
  14. 姓名:小黑,平均分:70,成绩:{'avg_score': 70, 'English': 75, 'Math': 65, 'Chniese': 70}
  15. 姓名:小红,平均分:60,成绩:{'avg_score': 60, 'English': 60, 'Math': 61, 'Chniese': 59}
复制代码
对列表中字典按多个键值排序
  1. from operator import itemgetter
  2. data = [
  3.     {'code': 1, 'position': 300, 'time': '1620442242'},
  4.     {'code': 2, 'position': 255, 'time': '1620442242'},
  5.     {'code': 3, 'position': 256, 'time': '1620442242'},
  6.     {'code': 1, 'position': 500, 'time': '1620442242'},
  7.     {'code': 5, 'position': 455, 'time': '1620442242'},
  8.     {'code': 1, 'position': 322, 'time': '1620442242'},
  9.     {'code': 6, 'position': 676, 'time': '1620442242'},
  10. ]
  11. data = sorted(data, key=itemgetter('code', 'position'))
  12. print(data)
复制代码
输出:
  1. [
  2. {'code': 1, 'position': 300, 'time': '1620442242'},
  3. {'code': 1, 'position': 322, 'time': '1620442242'},
  4. {'code': 1, 'position': 500, 'time': '1620442242'},
  5. {'code': 2, 'position': 255, 'time': '1620442242'},
  6. {'code': 3, 'position': 256, 'time': '1620442242'},
  7. {'code': 5, 'position': 455, 'time': '1620442242'},
  8. {'code': 6, 'position': 676, 'time': '1620442242'}]
复制代码
71、时间格式与字符串互转、比较大小
  1. import datetime
  2. # 当前时间转字符串
  3. now = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S')
  4. # 字符串转时间格式
  5. now = datetime.datetime.strptime(now, '%Y-%m-%d %H:%M:%S')
  6. a = now + datetime.timedelta(minutes=-15)
  7. # 时间比较大小
  8. if a < now:
  9.     print('yes')
复制代码
72、python把’\u’开头的字符串转中文
  1. str_data = '\\u7528\\u6237 ID \\u6216\\u5bc6\\u7801\\u9519\\u8bef'
  2. # 字符串.encode('utf-8').decode('unicode_escape')
  3. str_data_to_zh = str_data.encode('utf-8').decode('unicode_escape')
  4. print(str_data_to_zh)
  5. # 输出
  6. 用户 ID 或密码错误
复制代码
73、django进行数据迁移时出现No changes detected解决方案

原因:可能是由于app下面没有migrations文件夹
所以需要创建这个文件夹,命令
  1. python manage.py makemigrations --empty 你的app名称
复制代码
74、ubuntu下载文件到windows桌面
  1. apt install lrzsz
  2. sz 123.txt
复制代码
75、git查看提交日志
  1. git log --author="ldc"
复制代码
76、python翻译模块

可以把英文翻译成中文,也可以把中文翻译成英文
  1. pip install  translate
  2. from translate import Translator
  3. name = 'giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca'
  4. translator = Translator(to_lang="chinese")
  5. translation = translator.translate(name)
  6. print(translation)
  7. translator= Translator(from_lang="chinese",to_lang="english")
  8. translation = translator.translate("我想你")
  9. print(translation)
  10. 输出:
  11. 大熊猫,熊猫,熊猫熊,浣熊,大熊猫
  12. I missed you.
复制代码
77、python实现字符串转字典
  1. import ast
  2. import json
  3. target_str = '{"h": 1, "e": 2, "l": 3, "l": 4, "o": 5}'
  4. target_str2 = "{'h': 1, 'e': 2, 'l': 3, 'l': 4, 'o': 5}"
  5. # 方式1:使用json,缺点,字符串中不能出现单引号
  6. # 由于 json 语法规定 数组或对象之中的字符串必须使用双引号,不能使用单引号
  7. # 官网https://www.json.org/json-en.html上有一段描述是
  8. # A string is a sequence of zero or more Unicode characters, wrapped in double quotes, using backslash escapes
  9. print(json.loads(target_str))
  10. # print(json.loads(target_str2))   # 使用json转这个字符串会报错 Expecting property name enclosed in double quotes
  11. # 方式2:使用eval函数,缺点,不安全
  12. print(eval(target_str))
  13. print(eval(target_str2))
  14. # print(eval("__import__('os').system('dir')"))  # 会列出当前的目录文件,如果字符串是一些删除命令,则可以把整个目录清空!
  15. # 方式3,使用ast.literal_eval,没有json与eval的缺点,推荐使用这个
  16. print(ast.literal_eval(target_str))
  17. print(ast.literal_eval(target_str2))
复制代码
输出:
  1. {'h': 1, 'e': 2, 'l': 4, 'o': 5}
  2. {'h': 1, 'e': 2, 'l': 4, 'o': 5}
  3. {'h': 1, 'e': 2, 'l': 4, 'o': 5}
  4. {'h': 1, 'e': 2, 'l': 4, 'o': 5}
  5. {'h': 1, 'e': 2, 'l': 4, 'o': 5}
复制代码
78、django app 如何在后台显示中文名

1.在app (这里以user为例)下面的__init__.py文件中
添加:
  1. default_app_config = 'user.apps.UserConfig'
复制代码
2.在apps.py中
  1. from django.apps import AppConfig
  2. class UserConfig(AppConfig):
  3.     name = 'user'
  4.     verbose_name = '用户'
复制代码
79、使用python给Excel指定行添加数据
  1. import openpyxl, sys
  2. wb = openpyxl.load_workbook('b.xlsx')
  3. sheet = wb['Sheet1']
  4. # 在excel表格第二行添加新数据
  5. addrow = 1   # 增加一行
  6. row = 2  # 在第二行新增一行
  7. name = 'b-back.xlsx' # 新的表名
  8. wb1 = openpyxl.Workbook()
  9. sheet1 = wb1['Sheet']
  10. # 复制前row行
  11. for i in range(1, row):
  12.     for j in range(1, sheet.max_column + 1):
  13.         sheet1.cell(row=i, column=j).value = sheet.cell(row=i, column=j).value
  14. # 复制后row行
  15. for i in range(row, sheet.max_row + 1):
  16.     for j in range(1, sheet.max_column + 1):
  17.         if i == row:
  18.             # 给第row行添加新的数据
  19.             sheet1.cell(row=row, column=j).value = '新增'
  20.         sheet1.cell(row=i + addrow, column=j).value = sheet.cell(row=i, column=j).value
  21. wb1.save(name)
复制代码

80、python中的format格式拼接字符串
  1. d = {'a': 1, 'b': 2, 'c': 3, 'd': 5}
  2. print('{a},{b}'.format(**d))
  3. print('{0},{1},{0}'.format('a', 'b'))
  4. print(f"{d['a']}")
复制代码
输出:
  1. 1,2
  2. a,b,a
  3. 1
复制代码
81、数据库inner join、full join、left join、union、union all区别

表a_test

表b_test

INNER JOIN
是A和B的交集
  1. SELECT * FROM a_test INNER JOIN b_test ON a_test.name = b_test.namesa
  2. Inner join 产生的结果集中,是A和B的交集。
复制代码

FULL OUTER JOIN
产生A和B的并集
  1. SELECT * FROM a_test FULL OUTER JOIN b_test ON a_test.name = b_test.name
  2. Full outer join 产生A和B的并集。
  3. 但是需要注意的是,对于没有匹配的记录,则会以null做为值。
  4. 可以使用IF NULL判断。
复制代码
  1. SELECT * FROM a_test FULL OUTER JOIN b_test ON a_test.name = b_test.name
  2. WHERE a_test.id IS null OR b_test.id IS null
  3. 产生A表和B表没有交集的数据集。
复制代码

LEFT [OUTER] JOIN
产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代
  1. SELECT * FROM a_test LEFT OUTER JOIN b_test ON a_test.name = b_test.name
  2. 有些数据库可以不要OUTER
  3. SELECT * FROM a_test LEFT  JOIN b_test ON a_test.name = b_test.name
  4. Left outer join 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。
复制代码
  1. SELECT * FROM a_test LEFT OUTER JOIN b_test ON a_test.name = b_test.name
  2. WHERE b_test.id IS null
  3. 产生在A表中有而在B表中没有的集合。
复制代码

RIGHT [OUTER] JOIN
RIGHT OUTER JOIN 是后面的表为基础,与LEFT OUTER JOIN用法类似。
UNION 与 UNION ALL
  1. UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
  2. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。
  3. 列也必须拥有相似的数据类型。
  4. 同时,每条 SELECT 语句中的列的顺序必须相同。
  5. UNION 只选取记录,而UNION ALL会列出所有记录。
  6. SELECT name FROM a_test UNION SELECT name FROM b_test
  7. 选取不同值
复制代码
  1. SELECT a_test.id,a_test.name  FROM a_test
  2. UNION
  3. SELECT b_test.id,b_test.name FROM b_test
  4. 由于 id 51 xh   与 id 4 xh 并不相同,不合并
复制代码
  1. SELECT name FROM a_test UNION ALL SELECT name FROM b_test
  2. 全部列出来
复制代码

还需要注意的是我们还有一个是“交差集” cross join, 这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。
表达式如下:SELECT * FROM a_test CROSS JOIN b_test
这个笛卡尔乘积会产生 4 x 4 = 16 条记录,一般来说,我们很少用到这个语法。但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。
82、windows电脑查看端口使用情况

找出8000端口对应的PID进程,命令为:
  1. netstat -ano|findstr 8000
复制代码
进程信息如下:
  1. TCP    0.0.0.0:8000           0.0.0.0:0              LISTENING       1620
  2. UDP    0.0.0.0:8000           *:*                                    1620
复制代码
找出进程对应的详细信息:
  1. tasklist |findstr 1620
  2. KGService.exe                 1620 Console                    1     18,696 K
复制代码
关进程:
  1. taskkill /pid 1620 /F
复制代码
查看程序占用内存
比如查看python占用运行内存
  1. tasklist  /fi "imagename eq python.exe"
复制代码

83、Django生成表和反向生成Model
  1. 正向生成:
  2. python manage.py makemigrations
  3. python manage.py migrate
  4. 反向:
  5. 会根据设置的数据库中的表在自动生成对应的Model代码,并打印出来
  6. python manage.py inspectdb
  7. 以直接将打印的代码直接导入到指定的Model文件中
  8. python manage.py inspectdb > models.py
复制代码
84、windows的hosts文件位置
  1. C:\Windows\System32\drivers\etc\hosts
复制代码
85、postgresql数据库
  1. # 如果表存在就先删除
  2. drop table if exists student;
  3. # 创建学生表
  4. # id      serial not null  表示id自增
  5. # id      integer not null  表示id不自增
  6. create table student
  7. (
  8.     id                    serial not null
  9.         constraint student_pk
  10.             primary key,
  11.     name                  varchar,
  12.     class_id              integer,
  13.     height                numeric,
  14.     weight                numeric,
  15.     write_date            timestamp
  16. );
  17. comment on table student is '学生表';
  18. comment on column student.name is '名称';
  19. comment on column student.class_id is '班级ID';
  20. comment on column student.height is '身高';
  21. comment on column student.weight is '体重';
  22. comment on column student.write_date is '修改时间';
  23. alter table student
  24.     owner to odoo;
  25. # 更新
  26. update user set name='张三' where id=111
  27. # 更新表a的字段为表b的值
  28. update account_invoice
  29. set sale_order_id=so.id
  30. from sale_order so
  31. where account_invoice.origin=so.name
  32. # 新增
  33. insert into "user" (name,sex) values ('小明',1),('小红', 0)
  34. # 新增或更新
  35. 如果id冲突就更新
  36. INSERT INTO  student(id, name)
  37.    VALUES(12, '小明'),(13, '小红')
  38.    ON conflict(id) DO UPDATE
  39.    SET name ='未知';
  40. 如果id冲突就什么也不做
  41. INSERT INTO  student(id, name)
  42.    VALUES(12, '小明'),(13, '小红')
  43.    ON conflict(id) DO NOTHING;
  44. # 把一个表中的数据插入到另一个表中
  45. insert into 目标表名 (column1,column2,columnn) select value1,value2,valuen from  源表名
  46. 比如:
  47. insert into student (name, classs_name,create_date) select  student_name as name, class_name, now() from class_table;
  48. # 获取当前时间
  49. now()
  50. select now()
  51. # 删除
  52. DELETE FROM table_name [WHERE Clause]
  53. # 增加字段
  54. alter table 表名 add column 列名 类型;
  55. # 删除字段
  56. alter table 表名 dropcolumn 列名 ;
  57. # postgresql数据库查看表所有字段
  58. select * from information_schema.columns where table_schema='public' and table_name='表名';
  59. # postgresql获取所有表名
  60. select tablename from pg_tables where schemaname='public'
  61. # 对查询结果按id降序显示
  62. select * from table_name order by id desc
  63. # 对查询结果按id升序显示
  64. select * from table_name order by id asc
  65. # 转义字符, 查找name中包含单引号的记录
  66. select * from student where name like  E'%\'%';
  67. # 查看表记录总数
  68. select relname as TABLE_NAME, reltuples as rowCounts from pg_class where relkind = 'r' and relnamespace = (select oid from pg_namespace where nspname='public') order by rowCounts desc;
  69. # 将结果转换为数组
  70. SELECT array(SELECT "name" FROM sale_order);
  71. # 将数组合并为字符串
  72. select array_to_string(array[1,2,3], ',')
  73. # 联合子集更新,把sale_order_line的name连接换行符,然后按id更新到表a_test中对应的name
  74. update a_test set name=array_to_string(array(select name from sale_order_line where order_id=a_test.id),'<br/>');
  75. # PostgreSQL合并查询同一列的多条记录,针对一对多,多对多字段
  76. 比如表:
  77. id   name
  78. 1    小明
  79. 1    小红                     id   name
  80. 1    小亮        -->          1    小明,小亮,小红
  81. 2    小强                     2    小强,小王
  82. 2    小王
  83. SELECT
  84.     id, array_to_string(ARRAY(SELECT unnest(array_agg(name order by name desc))),',') AS all_name
  85. FROM
  86.     student
  87. GROUP BY id;
  88. # case语句
  89. case var
  90.         when condition1 then statement1
  91.         when condition2 then statement2
  92. else statementn
  93. end as new_name
  94. 比如:
  95. select case name
  96.         when '小明' then 'xm'
  97.         when '小红' then 'xh'
  98.         when '小刚' then 'xg'
  99. else 'xw'
  100. end as short_name
  101. from student
  102. # 临时表、字符串合并、类型转换、时间格式转换、当前时间
  103. WITH TEMP AS (
  104.         SELECT CAST ( concat ( bam.account_period_code, '-01' ) AS TIMESTAMP )
  105.            AS account_period_time
  106.                  FROM bi_account_move AS bam )
  107. SELECT
  108.         account_period_time,
  109.         to_char(CURRENT_DATE,'yyyy-MM-dd hh24:MI:ss') as current_date,
  110.         to_char( account_period_time, 'yyyy' ) as year,
  111.         to_char( account_period_time, 'MM' ) as month,
  112.         to_char( account_period_time, 'dd' ) as day
  113. FROM TEMP
  114. 比如:
  115. account_period_time        current_date            year        month        day
  116. 2019-06-01 0:00:00        2020-06-24 00:00:00        2019         06             01
  117. 2019-06-01 0:00:00        2020-06-24 00:00:00        2019         06             01
  118. # 多个字符串拼接
  119. select
  120. concat('payment_', CAST(ap.id as varchar)) as line_key
  121. from ap
  122. # 将查询所得结果集的某一字段拼接成字符串,默认的是逗号
  123. select GROUP_CONCAT(id) from test where id>5;
  124. 结果为:
  125. 1,2,3,4,5,6,7
  126. # 使用其他分隔符拼接
  127. select GROUP_CONCAT(id separator '-') from test where id>5;
  128. 结果为:
  129. 1-2-3-4-5-6-7
  130. # 多个临时表
  131. WITH temp_student AS ( SELECT ID, NAME, sex FROM student WHERE sex = TRUE ),
  132. temp_class AS (
  133.         SELECT
  134.                 ID,
  135.                 NAME,
  136.                 student_id,
  137.                 teacher_id
  138.         FROM
  139.                 the_class
  140.         ),
  141.         temp_teacher AS (
  142.         SELECT
  143.           ID,
  144.                 NAME,
  145.                 age
  146.         FROM
  147.                 teacher
  148.         )
  149.         SELECT
  150.         ts.NAME AS student_name,
  151.         tc.NAME AS class_name,
  152.         te.NAME AS teacher_name
  153.         from temp_student as ts
  154.         LEFT JOIN temp_class AS tc ON tc.student_id = ts.ID
  155.         LEFT JOIN teacher AS te ON te.id = tc.teacher_id
  156. # null转成有意义的值
  157. select COALESCE(name, '') as name from a_test
  158. 意思就是如果name为null,就转为空字符串
  159. # 字符串截取
  160. select SUBSTRING('abcd',1,2); -- result:ab 表示从下标从1开始,截取2个字符
  161. # 使用 interval 时间相加减(+/-)
  162. 当前时间 + 10秒,
  163. select to_char(now() + interval '10 second', 'yyyy-mm-dd hh24:mi:ss')  as reqDate from account_period;
  164. 当前时间 - 10秒
  165. select to_char(now() + interval '-10 second', 'yyyy-mm-dd hh24:mi:ss')  as reqDate from account_period;
  166. 当前时间 + 10分,
  167. select to_char(now() + interval '10 minute', 'yyyy-mm-dd hh24:mi:ss')  as reqDate  from account_period;
  168. 当前时间 + 10时,
  169. select to_char(now() + interval '10 hour', 'yyyy-mm-dd hh24:mi:ss')  as reqDate from account_period;
  170. 当前时间 + 10天,
  171. select to_char(now() + interval '10 day', 'yyyy-mm-dd hh24:mi:ss')  as reqDate from account_period;
  172. 当前时间 + 10年,
  173. select to_char(now() + interval '10 year', 'yyyy-mm-dd hh24:mi:ss')  as reqDate from account_period;
  174. # UNION types numeric and text cannot be matched
  175. NULL::NUMERIC
  176. 这个问题,是因为几个sql组合在一起时,同一个字段的值,遇到null时,需要进行类型转换。
  177. # 对行记录定义行编号,使用函数ROW_NUMBER()
  178. # 按分数进行降序,然后给行记录标记行编号,可以作为排名来使用
  179. select
  180.         ROW_NUMBER() OVER (ORDER BY score desc) AS sequence_number,
  181.         name,score
  182. from
  183.         b_test
  184. # 数字转字符串
  185. select cast(123 as VARCHAR);
  186. # 字符串转数字
  187. select cast('123' as INTEGER);
复制代码
86、python控制台输出带颜色的文字方法
  1. #格式:  设置颜色开始 :\033[显示方式;前景色;背景色m
  2. #说明:
  3. 前景色            背景色           颜色
  4. ---------------------------------------
  5. 30                40              黑色
  6. 31                41              红色
  7. 32                42              绿色
  8. 33                43              黃色
  9. 34                44              蓝色
  10. 35                45              紫红色
  11. 36                46              青蓝色
  12. 37                47              白色
  13. 显示方式           意义
  14. -------------------------
  15. 0                终端默认设置
  16. 1                高亮显示
  17. 4                使用下划线
  18. 5                闪烁
  19. 7                反白显示
  20. 8                不可见
  21. #例子:
  22. \033[1;31;40m   
  23. \033[0m         
复制代码
  1. 例子
  2. print('紫红字体 \033[1;35m hello world \033[0m!')
  3. print('褐色背景绿色字体 \033[1;32;43m hello world \033[0m!')
  4. print('\033[1;33;44mhello world\033[0m')
复制代码

87、控制台输出白色方框
  1. print('█')
复制代码
88、xadmin后台编辑多对多字段

在models.py定义了多对多字段,想要在编辑时可以灵活使用这个字段的话,可以按以下方法设置:
modes.py
  1. class Book(models.Model):
  2.     title = models.CharField(verbose_name="书名", max_length=32)
  3.     second_title = models.CharField(verbose_name="副标题", max_length=32, blank=True, null=True)
  4.     author = models.CharField(verbose_name="作者", max_length=32)
  5.     translator = models.CharField(verbose_name="译者", max_length=32, blank=True, null=True)
  6.     intro = models.TextField(verbose_name="描述")
  7.     pic = models.FileField(verbose_name="封面图片", max_length=64, upload_to='book_cover', null=True, blank=True)
  8.     tags = models.ManyToManyField(Tags, verbose_name='书籍标签', blank=True)
  9.     prizes = models.ManyToManyField(Prizes, verbose_name='获奖详情', blank=True)
  10.     sump = models.IntegerField(verbose_name="收藏人数", default=0)
  11.     rate_num = models.IntegerField(verbose_name="评分人数", default=0)
  12.     num = models.IntegerField(verbose_name="浏览量", default=0)
  13.     published_time = models.DateField(blank=True, null=True, verbose_name='出版时间')
  14.     create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
  15.     class Meta:
  16.         db_table = 'book'
  17.         verbose_name = "图书"
  18.         verbose_name_plural = "图书"
  19.     def __str__(self):
  20.         return self.title
复制代码
adminx.py
  1. # 书籍管理
  2. class BookAdmin(object):
  3.     search_fields = ['title', 'author', 'intro']  # 检索字段
  4.     list_display = ['id', 'show_pic', 'title', 'second_title', 'author', 'translator', 'published_time', 'intro',
  5.                     'tags', 'prizes', 'num', 'sump', 'rate_num']  # 要显示的字段
  6.     list_filter = ['published_time', 'tags', 'prizes']  # 分组过滤的字段
  7.     ordering = ('id',)  # 设置默认排序字段,负号表示降序排序
  8.     list_per_page = 30  # 默认每页显示多少条记录,默认是100条
  9.     model_icon = 'fa fa-book'  # 左侧小图标
  10.     list_editable = ['title', 'author', 'intro', 'published_time']  # 可编辑字段
  11.     style_fields = {'tags': 'm2m_transfer', 'prizes': 'm2m_transfer'}  # 控制字段的显示样式
  12.     filter_horizontal = ('tags', 'prizes')  # 水平选择编辑多对多字段
复制代码
重点是设置style_fields 和filter_horizontal ,效果:

89、Django后台通过按钮显示TextField字段内容

由于TextField字段类型内容可能很长,在后台显示时很占屏幕位置,可以通过按钮来控制显示,代码如下:
models.py中定义了一个TextField字段类型:
  1. class Prizes(models.Model):
  2.     name = models.CharField(max_length=32, verbose_name="奖项")
  3.     intro = models.TextField(blank=True, null=True, verbose_name='简介')
  4.     class Meta:
  5.         db_table = 'prizes'
  6.         verbose_name = "奖项"
  7.         verbose_name_plural = "奖项"
  8.     def __str__(self):
  9.         return self.name
复制代码
这里使用xadmin作为后台管理框架,在adminx.py中代码如下:
  1. import xadmin
  2. from django.utils.safestring import mark_safe
  3. from xadmin import views
  4. from .models import *
  5. # 奖项管理
  6. class PrizesAdmin(object):
  7.     search_fields = ['name']  # 检索字段
  8.     list_display = ['id', 'name', 'show_intro']
  9.     list_filter = ['name']
  10.     ordering = ('id',)
  11.     def show_intro(self, obj):
  12.         # 显示简介
  13.         if not obj.intro:
  14.             return mark_safe('')
  15.         if len(obj.intro) < 20:
  16.             return mark_safe(obj.intro)
  17.         short_id = f'{obj._meta.db_table}_short_text_{obj.id}'
  18.         short_text_len = len(obj.intro) // 4
  19.         short_text = obj.intro[:short_text_len] + '......'
  20.         detail_id = f'{obj._meta.db_table}_detail_text_{obj.id}'
  21.         detail_text = obj.intro
  22.         text = """
  23.                     
  24.                     <p id="%s">%s</p>
  25.                     <p><a target="_blank" href="https://www.cnblogs.com/###" οnclick="openShutManager(this,'%s',false,'点击关闭','点击展开','%s')">点击展开</a></p>
  26.                     <p id="%s" >
  27.                        %s
  28.                     </p>
  29.                     """ % (short_id, detail_id, short_id, short_text, detail_id, short_id, detail_id, detail_text)
  30.         return mark_safe(text)
  31.     show_intro.short_description = '描述'
复制代码
注意:复制代码后需要做如下修改:

一开始效果

点击展开效果:

90、前端判断上传的文件是否为图片且限制大小为300kB
  1. <!DOCTYPE html>
  2. <html lang="en-us">
  3. <body >
  4. <input  id="id_icon" name="icon" type="file" onchange="imgTypeSize('id_icon',300)"
  5. </body>
  6. </html>
复制代码
输出:
  1. <form action="" method="post" id="login-form" onsubmit="return toVaild()">
  2.         <input  id="id_account" name="account" type="text" placeholder="账号"/>
  3.         <input  id="id_password" name="password" type="password" placeholder="密码">
  4. <form>
复制代码
105、获取时间字符串的月份数
  1. import collections
  2. d1 = collections.OrderedDict()  # 创建一个有序字典
  3. d1['a'] = 'A'
  4. d1['b'] = 'B'
  5. d1['c'] = 'C'
  6. d1['d'] = 'D'
  7. for k, v in d1.items():
  8.     print(k, v)
复制代码
106、字符串不足补零
  1. pip install pypiwin32
  2. import win32com.client
  3. spk = win32com.client.Dispatch("SAPI.SpVoice")
  4. spk.Speak(u"my name is ldc,what is your name")
  5. spk.Speak(u"大家好")
复制代码
107、时间戳转字符串日期
  1. # pip install pypiwin32 -i https://pypi.python.org/simple
  2. import win32com.client
  3. import time
  4. import winsound
  5. spk = win32com.client.Dispatch("SAPI.SpVoice")
  6. # 定义闹钟时间
  7. clocktime = [[19, 19], [11, 10], [12, 10], [18, 47]]
  8. runinghour = 1  # 定义运行时间
  9. times = runinghour * 3600  # 次数
  10. print(times)
  11. for i in range(1, times):
  12.     time_now = [time.localtime(time.time()).tm_hour, time.localtime(time.time()).tm_min]
  13.     if time_now in clocktime:
  14.         print(time_now)
  15.         winsound.Beep(1000, 1000)
  16.         spk.Speak(u"快去看下饭好了没有?")
  17.     time.sleep(60)  # 每分钟对比一次时间
复制代码
使用函数:
  1. def get_month_days(year, month):
  2.     """
  3.     根据年份,月份信息显示此月份天数
  4.     :param year: 年份:
  5.     :param month: 月份(1~12):
  6.     :return: 当月天数
  7.     """
  8.     if month >12 or month <= 0:
  9.         return -1
  10.     if month == 2:
  11.         return 29 if year % 4 == 0 and year % 100 != 0 or year % 400 == 0 else 28
  12.     if month in (4, 6, 9, 11):
  13.         return 30
  14.     else:
  15.         return 31
  16. a = '2020-04'.split('-')
  17. year = int(a[0])
  18. month = int(a[1])
  19. print(get_month_days(year,month))
  20. 输出:
  21. 30
复制代码
108、列表转字符串
  1. from django.urls import path
  2. from django.views.generic import RedirectView
  3. urlpatterns = [
  4.         # 访问favicon.ico 网站图标
  5.     path("favicon.ico",RedirectView.as_view(url='static/favicon.ico')),
  6. ]
复制代码
109、pip国内镜像源
  1.     STATIC_URL = '/static/'
  2.     # 添加静态资源路由地址
  3.     STATICFILES_DIRS = [
  4.         os.path.join(BASE_DIR, 'static'),
  5.     ]
  6.     # 使用python manage.py collectstatic收集静态文件时时使用STATIC_ROOT
  7.     # STATIC_ROOT = os.path.join(BASE_DIR, 'static')
复制代码
110、python把时间字符串转换成刚刚、1天前、3个月前、1年前
  1. from django.urls import path, re_path
  2. from django.views.generic import RedirectView
  3. from django.views.static import serve
  4. from '你的项目名称' import settings
  5. urlpatterns = [
  6.     path("favicon.ico",RedirectView.as_view(url='static/favicon.ico')),
  7.     re_path('static/(?P<path>.*)$', serve, {'document_root': settings.STATICFILES_DIRS[0]}),
  8. ]
复制代码
111、Django使用ORM执行sql语句

通过raw函数执行
  1.     data = {'msg': '创建成功',}
  2.     return JsonResponse(data=data, json_dumps_params={'ensure_ascii': False})
复制代码
112、Django通过变量字段获取数据

通过方法__getattribute__来获取
  1. import calendar
  2. def get_month_start_and_end(date=datetime.datetime.now()):
  3.     """
  4.     获取当前时间的月份首日与最后一天
  5.     :param date:
  6.     :return: (首日,最后一天)
  7.     """
  8.     year, month = str(date).split('-')[0], str(date).split('-')[1]
  9.     end = calendar.monthrange(int(year), int(month))[1]
  10.     return f'{year}-{month}-01', f'{year}-{month}-{end}'
复制代码
113、Django查询变量字段、更新变量字段

通过**{变量名:值}来操作
  1. import xadmin
  2. from django.db.models import  Sum
  3. from xadmin.plugins.actions import BaseActionView
  4. class MyCountFeeAction(BaseActionView):
  5.     """
  6.         用户余额统计
  7.         """
  8.     action_name = "countuserfee"  #: 相当于这个 Action 的唯一标示, 尽量用比较针对性的名字
  9.     description = u'统计用户总余额'  #: 描述, 出现在 Action 菜单中, 可以使用 ``%(verbose_name_plural)s`` 代替 Model 的名字.
  10.     model_perm = 'view'  # 权限
  11.     def do_action(self, queryset):
  12.         all_balance = MallUser.objects.all().aggregate(Sum('balance'))
  13.         return HttpResponse(f'用户总余额{all_balance}')
  14. class UserAdmin(object):
  15.     """用户信息管理"""
  16.     list_display = ['username', 'balance', 'status', 'addtime']
  17.     search_fields = ['username', ]
  18.     list_filter = ['status', 'addtime']
  19.     list_per_page = 30  # 默认每页数量
  20.     model_icon = 'fa fa-user'
  21.     list_editable = ['status']
  22.     ordering = ['-addtime']
  23.     actions = [ MyCountFeeAction]  # 添加批量选择操作
复制代码
114、vue生成dist文件

安装npm,到官网下载
在vue项目下打开cmd,输入命令
  1. 把self.lookup_choices = field.get_choices(include_blank=False)
  2. 改为:
  3. # 调用自定义的方法
  4. if hasattr(model_admin, '{field}_choices'.format(field=field.name)):
  5.         self.lookup_choices = getattr(model_admin, '{field}_choices'.format(field=field.name))(field, request,params, model,model_admin,field_path)
  6.     else:
  7.         self.lookup_choices = field.get_choices(include_blank=False)
复制代码
如果报错,npm ERR! missing script: build,
则使用以下命令
  1. 把self.lookup_choices = field.get_choices(include_blank=False)
  2. 改为:
  3. # 调用自定义的方法
  4. if hasattr(model_admin, '{field}_choices'.format(field=field.name)):
  5.         self.lookup_choices = getattr(model_admin, '{field}_choices'.format(field=field.name))(field, request,params, model,model_admin,field_path)
  6.     else:
  7.         self.lookup_choices = field.get_choices(include_blank=False):prod
复制代码
具体看package.json

115、python获取电脑磁盘、CPU、内存使用情况
  1. from django.utils.decorators import method_decorator
  2. from django.views.decorators.csrf import csrf_exempt
  3. @method_decorator(csrf_exempt)
  4. def update_data(request):
  5.     if request.method == 'POST':
  6.             pass
  7.         elif request.method == 'GET':
  8.             pass
复制代码
116、max比较字典列表
  1. import pandas as pd
  2. from functools import reduce
  3. # 二维数组,对列和行求和
  4. a = [
  5.     ['', 0, '', 1, 4.1],
  6.     ['', 0, '', '', 4],
  7.     ['123', 0, '', 3, 4, 6,7],
  8. ]
  9. def aa(x, y):
  10.     x = 0 if isinstance(x, str) else x
  11.     y = 0 if isinstance(y, str) else y
  12.     return x + y
  13. # 对行求和
  14. row_sum = [reduce(aa, i) for i in a]
  15. # 对列求和,只能处理相同长度的子元素
  16. column_sum_1 = [reduce(aa, i) for i in zip(*a)]
  17. # 对列求和,可以处理不同长度的子元素
  18. column_sum_2 = list(dict(pd.DataFrame(a).fillna(0).apply(lambda x: '' if any(isinstance(d, str) for d in x) else round(x.sum(), 2))).values())
  19. print('行求和:{}\r\n列求和(相同长度):{}\r\n列求和:{}'.format(row_sum, column_sum_1, column_sum_2))
复制代码
117、django查询表的具体字段
  1. 行求和:[5.1, 4, 20]
  2. 列求和(相同长度):[0, 0, 0, 4, 12.1]
  3. 列求和:['', 0, '', '', 12.1, 6.0, 7.0]
复制代码
118、MySQL查询数据添加自增序号
  1. from datetime import datetime
  2. def get_months(start_month_str, end_month_str):
  3.     '''
  4.     # 获取时间字符串中的月份数
  5.     :param start_month_str: 开始字符串
  6.     :param end_month_str: 结束字符串
  7.     :return: 月份数
  8.     '''
  9.     end_month_date = datetime.strptime(end_month_str, '%Y-%m')
  10.     start_month_date = datetime.strptime(start_month_str, '%Y-%m')
  11.     end_year, end_month = end_month_date.year, end_month_date.month
  12.     start_year, start_month = start_month_date.year, start_month_date.month
  13.     return (end_year - start_year) *12 + (end_month - start_month) + 1
  14. end_month_str = '2021-02'
  15. start_month_str = '2020-07'
  16. print(get_months(start_month_str, end_month_str))
  17. 输出:
  18. 8
复制代码
119、MySQL 时间截取年月日
  1. print('hello world'.zfill(15)) # 补0
  2. print('hello world'.rjust(15)) # 右对齐,补空格
  3. print('hello world'.ljust(15)) # 左对齐,补空格
  4. 输出:
  5. 0000hello world
  6.     hello world
  7. hello world
复制代码

120、 列表取奇数下标值
  1. import time
  2. t1 = time.time()
  3. print(t1)
  4. print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(t1)))
  5. 输出:
  6. 1621741567.082192
  7. 2021-05-23 11:46:07
复制代码
121、列表取偶数下标值
  1. # !/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. """
  4. @contact: 微信 1257309054
  5. @file: 时间戳转日期.py
  6. @time: 2022/6/27 17:16
  7. @author: LDC
  8. """
  9. import time
  10. import datetime
  11. # 正确10位长度的时间戳可精确到秒,11-14位长度则是包含了毫秒
  12. def int_to_datetime(intValue):
  13.     if len(str(intValue)) == 10:
  14.         # 精确到秒
  15.         timeValue = time.localtime(intValue)
  16.         tempDate = time.strftime("%Y-%m-%d %H:%M:%S", timeValue)
  17.         datetimeValue = datetime.datetime.strptime(tempDate, "%Y-%m-%d %H:%M:%S")
  18.     elif 10 < len(str(intValue)) and len(str(intValue)) < 15:
  19.         # 精确到毫秒
  20.         k = len(str(intValue)) - 10
  21.         timetamp = datetime.datetime.fromtimestamp(intValue / (1 * 10 ** k))
  22.         datetimeValue = timetamp.strftime("%Y-%m-%d %H:%M:%S.%f")
  23.     else:
  24.         return -1
  25.     return datetimeValue
  26. time1 = 1656321420
  27. time2 = 1656321086560
  28. print(int_to_datetime(time1))
  29. print(int_to_datetime(time2))
  30. '''
  31. 输出:
  32. 2022-06-27 17:17:00
  33. 2022-06-27 17:11:26.560000
  34. '''
复制代码
122、列表相同元素分类、分组
  1. a = [1,2,3]
  2. print(','.join(map(str,a)))
  3. 输出:
  4. `1,2,3`
复制代码
123、ubuntu切换用户

1)从user用户切换到root用户
sudo su
2)从root用户切回user用户
su user (user是你自己安装时候的用户名),或是直接输入exit,也可Ctrl+D组合键推出
124、numpy二维数组获取某一列
  1. pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple
  2. 清华:-i https://pypi.tuna.tsinghua.edu.cn/simple
  3. 阿里云:-i http://mirrors.aliyun.com/pypi/simple/
  4. 中国科技大学 -i https://pypi.mirrors.ustc.edu.cn/simple/
  5. 华中理工大学:-i http://pypi.hustunique.com/
  6. 山东理工大学:-i http://pypi.sdutlinux.org/
  7. 豆瓣:-i http://pypi.douban.com/simple/
复制代码
来源:https://www.cnblogs.com/superwinner/p/17052473.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具