Python资料整理
python常见问题总结
设置Linux账号的有效时间
在linux系统中,默认创建的用户的有效期限都是永久的,但有时候,我们需要对某些用户的有效期限做个限定! 比如:公司给客户开的ftp账号,用于客户下载新闻稿件的。这个账号是有时间限制的,因为是付费的。合同到期了,这个账号就要求停用。 废话不多说,直接说下操作记录: 需求: 创建lzwb账号,用于下载/home/hqsb里面的新闻稿件,这个账号的合同到期时间是2018年10月26号 1)创建账号lzwb [root@dev ~]# useradd lzwb -d /home/hqsb -s /sbin/nologin 2)默认情况下,这个账号建立后,有效期限是永久的。注意下面命令结果: Last password change: 表示账号创建时的时间 Account expires: 表示账号到期时间 命令格式:chage -l username 查看用户的到期时间情况 [root@dev ~]# chage -l lzwb Last password change : Oct 26, 2016 Password expires : never Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7 3)按照需求,修改账号的到期时间 命令格式:usermod -e "到期时间" username 修改系统用户的时间 [root@dev ~]# usermod -e "Oct 26,2018" lzwb 再次查看,发现lzwb的有效时间截止到2018年的10月26号了。 [root@dev ~]# chage -l lzwb Last password change : Oct 26, 2016 Password expires : never Password inactive : never Account expires : Oct 26, 2018 Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7
bashrc文件中环境变量配置错误
【记录】bashrc文件中环境变量配置错误,导致linux无法正常使用的解决方案
**其实解决问题的方法很简单:把你在bashrc文件中写错的东西注释掉或者改写正确即可。** 可是此时图形界面登陆不了,vim用不了。怎么改? 解决方案: 步骤1:输入命令export PATH=/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 以上命令执行后,vim就可以使用了。 步骤2:vim /etc/bashrc 打开bashrc文件,注释掉新添加的语句(或是把他们修改正确)。 **步骤3:退出,重新登陆即可。**
Django model select的各种用法详解
Django model select的各种用法详解
基本操作
# 获取所有数据,对应SQL:select * from User User.objects.all() # 匹配,对应SQL:select * from User where name = '运维咖啡吧' User.objects.filter(name='运维咖啡吧') # 不匹配,对应SQL:select * from User where name != '运维咖啡吧' User.objects.exclude(name='运维咖啡吧') # 获取单条数据(有且仅有一条,id唯一),对应SQL:select * from User where id = 724 User.objects.get(id=123) 复制代码
常用操作
# 获取总数,对应SQL:select count(1) from User User.objects.count() User.objects.filter(name='运维咖啡吧').count() # 比较,gt:>,gte:>=,lt:<,lte: 724 User.objects.filter(id__gt=724) User.objects.filter(id__gt=1, id__lt=10) # 包含,in,对应SQL:select * from User where id in (11,22,33) User.objects.filter(id__in=[11, 22, 33]) User.objects.exclude(id__in=[11, 22, 33]) # isnull:isnull=True为空,isnull=False不为空,对应SQL:select * from User where pub_date is null User.objects.filter(pub_date__isnull=True) # like,contains大小写敏感,icontains大小写不敏感,相同用法的还有startswith、endswith User.objects.filter(name__contains="sre") User.objects.exclude(name__contains="sre") # 范围,between and,对应SQL:select * from User where id between 3 and 8 User.objects.filter(id__range=[3, 8]) # 排序,order by,'id'按id正序,'-id'按id倒叙 User.objects.filter(name='运维咖啡吧').order_by('id') User.objects.filter(name='运维咖啡吧').order_by('-id') # 多级排序,order by,先按name进行正序排列,如果name一致则再按照id倒叙排列 User.objects.filter(name='运维咖啡吧').order_by('name','-id') 复制代码
进阶操作
# limit,对应SQL:select * from User limit 3; User.objects.all()[:3] # limit,取第三条以后的数据,没有对应的SQL,类似的如:select * from User limit 3,10000000,从第3条开始取数据,取10000000条(10000000大于表中数据条数) User.objects.all()[3:] # offset,取出结果的第10-20条数据(不包含10,包含20),也没有对应SQL,参考上边的SQL写法 User.objects.all()[10:20] # 分组,group by,对应SQL:select username,count(1) from User group by username; from django.db.models import Count User.objects.values_list('username').annotate(Count('id')) # 去重distinct,对应SQL:select distinct(username) from User User.objects.values('username').distinct().count() # filter多列、查询多列,对应SQL:select username,fullname from accounts_user User.objects.values_list('username', 'fullname') # filter单列、查询单列,正常values_list给出的结果是个列表,里边里边的每条数据对应一个元组,当只查询一列时,可以使用flat标签去掉元组,将每条数据的结果以字符串的形式存储在列表中,从而避免解析元组的麻烦 User.objects.values_list('username', flat=True) # int字段取最大值、最小值、综合、平均数 from django.db.models import Sum,Count,Max,Min,Avg User.objects.aggregate(Count(‘id’)) User.objects.aggregate(Sum(‘age’)) 复制代码
时间字段
# 匹配日期,date User.objects.filter(create_time__date=datetime.date(2018, 8, 1)) User.objects.filter(create_time__date__gt=datetime.date(2018, 8, 2)) # 匹配年,year,相同用法的还有匹配月month,匹配日day,匹配周week_day,匹配时hour,匹配分minute,匹配秒second User.objects.filter(create_time__year=2018) User.objects.filter(create_time__year__gte=2018) # 按天统计归档 today = datetime.date.today() select = {'day': connection.ops.date_trunc_sql('day', 'create_time')} deploy_date_count = Task.objects.filter( create_time__range=(today - datetime.timedelta(days=7), today) ).extra(select=select).values('day').annotate(number=Count('id')) 复制代码
Q 的使用
Q对象可以对关键字参数进行封装,从而更好的应用多个查询,可以组合&(and)、|(or)、~(not)操作符。
例如下边的语句
from django.db.models import Q User.objects.filter( Q(role__startswith='sre_'), Q(name='公众号') | Q(name='运维咖啡吧') ) 复制代码
转换成SQL语句如下:
select * from User where role like 'sre_%' and (name='公众号' or name='运维咖啡吧') 复制代码
通常更多的时候我们用Q来做搜索逻辑,比如前台搜索框输入一个字符,后台去数据库中检索标题或内容中是否包含
_s 4000 = request.GET.get('search') _t = Blog.objects.all() if _s: _t = _t.filter( Q(title__icontains=_s) | Q(content__icontains=_s) ) return _t 复制代码
外键:ForeignKey
-
表结构:
class Role(models.Model):
name = models.CharField(max_length=16, unique=True)class User(models.Model):
username = models.EmailField(max_length=255, unique=True)
role = models.ForeignKey(Role, on_delete=models.CASCADE)
复制代码 -
正向查询:
查询用户的角色名
_t = User.objects.get(username=‘运维咖啡吧’)
_t.role.name
复制代码 -
反向查询:
查询角色下包含的所有用户
_t = Role.objects.get(name=‘Role03’)
_t.user_set.all()
复制代码 -
另一种反向查询的方法:
_t = Role.objects.get(name=‘Role03’)
这种方法比上一种_set的方法查询速度要快
User.objects.filter(role=_t)
复制代码 -
第三种反向查询的方法:
如果外键字段有 related_name 属性,例如models如下:
class User(models.Model): username = models.EmailField(max_length=255, unique=True) role = models.ForeignKey(Role, on_delete=models.CASCADE,related_name='roleUsers') 复制代码
那么可以直接用 related_name 属性取到某角色的所有用户
_t = Role.objects.get(name = 'Role03') _t.roleUsers.all() 复制代码
M2M:ManyToManyField
-
表结构:
class Group(models.Model):
name = models.CharField(max_length=16, unique=True)class User(models.Model):
username = models.CharField(max_length=255, unique=True)
groups = models.ManyToManyField(Group, related_name=‘groupUsers’)
复制代码 -
正向查询:
# 查询用户隶属组
_t = User.objects.get(username = ‘运维咖啡吧’)
_t.groups.all()
复制代码 -
反向查询:
# 查询组包含用户
_t = Group.objects.get(name = ‘groupC’)
_t.user_set.all()
复制代码
同样M2M字段如果有 related_name 属性,那么可以直接用下边的方式反查
_t = Group.objects.get(name = 'groupC') _t.groupUsers.all() 复制代码
get_object_or_404
正常如果我们要去数据库里搜索某一条数据时,通常使用下边的方法:
_t = User.objects.get(id=734) 复制代码
但当 id=724 的数据不存在时,程序将会抛出一个错误
abcer.models.DoesNotExist: User matching query does not exist. 复制代码
为了程序兼容和异常判断,我们可以使用下边两种方式:
-
方式一: get 改为 filter
_t = User.objects.filter(id=724)
# 取出_t之后再去判断_t是否存在
复制代码 -
方式二:使用 get_object_or_404
from django.shortcuts import get_object_or_404
_t = get_object_or_404(User, id=724)
# get_object_or_404方法,它会先调用django的get方法,如果查询的对象不存在的话,则抛出一个Http404的异常
复制代码
实现方法类似于下边这样:
from django.http import Http404 try: _t = User.objects.get(id=724) except User.DoesNotExist: raise Http404 复制代码
get_or_create
顾名思义,查找一个对象如果不存在则创建,如下:
object, created = User.objects.get_or_create(username='运维咖啡吧') 复制代码
返回一个由object和created组成的元组,其中object就是一个查询到的或者是被创建的对象,created是一个表示是否创建了新对象的布尔值
实现方式类似于下边这样:
try: object = User.objects.get(username='运维咖啡吧') created = False exception User.DoesNoExist: object = User(username='运维咖啡吧') object.save() created = True returen object, created 复制代码
执行原生SQL
Django中能用ORM的就用它ORM吧,不建议执行原生SQL,可能会有一些安全问题,如果实在是SQL太复杂ORM实现不了,那就看看下边执行原生SQL的方法,跟直接使用pymysql基本一致了
from django.db import connection with connection.cursor() as cursor: cursor.execute('select * from accounts_User') row = cursor.fetchall() return row 复制代码
了解框架原理过程
了解框架原理过程
Excel导入导出
jquery
www.bootcss.com/p/layoutit/ -bootstrap可视化布局系统
www.jeasyui.net/ -Jquery EasyUI布局
http://echarts.baidu.com 数据分析图表
https://npm.taobao.org/ 淘宝NPM镜像
Node.js 独立运行前端逻辑 没有数据可以进行页面跳转
后端与前端对接测试:
用node.js进行前端对接测试 模拟真实环境测试
防SQL注入处理 密文传输
代码封装成工具类 方便使用
部署:
nohub supervisor dock
ngnix配置
sudo vim /etc/nginx/conf.d/axf.conf
server{ listen 80; server_name 106.12.110.107; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /static{ alias /home/dingzq/axfnginx/static; } }
sudo vim /etc/supervisor/conf.d/axf.conf
[program:axf] directory=/home/dingzq/axfnginx command=gunicorn AXF_Project.wsgi -c conf/axf.conf autostart=true startsecs=10 autorestart=true startretries=3 user=root priority=999 redirect_stderr=true stdout_logfile_maxbytes=100MB stdout_logfile_backups = 20 stdout_logfile=/home/dingzq/axfnginx/log/axf.out stopasgroup=false killasgroup=false
gunicorn AXF_Project.wsgi -c conf/axf.conf
gunicorn blogproject.wsgi -c conf/blog.conf
sudo systemctl restart nginx
sudo supervisorctl restart all
vim conf/axf.conf
command = 'gunicorn' pythonpath = '/home/dingzq/axfnginx' bind = '127.0.0.1:8000' workers = 2 一个nginx带多个tomcat集群环境,老是报如下错误: 2012/03/07 15:30:39 /opt/nginx/proxy_temp/4/31/0000000314" failed (13: Permission denied) while reading upstream, client: 172.16.1.33, server: www.XXX.com, request: "POST /XXX.do HTTP/1.1", upstream: "http://xxx.com/XXXX.do", host: "XXXX.com", referrer: "http:// www.2cto.com /XXXX.do" 查看了一下nginx进程ps aux|grep nginx 发现都是nobody的进程,但是nginx的目录都是root用户,另外集群tomcat也是属于root用户,而且root启动,查看nginx.conf: user nobody 改成:user root 停止nginx -s stop 重启nginx -c nginx.conf 测试... 搞定。
python虚拟环境创建和激活
python虚拟环境创建和激活
1、创建虚拟环境
$ mkdir work $ python3 -m venv work/ # 查看虚拟环境目录结构 $ cd work $ ls bin include lib lib64 pyvenv.cfg share # 查看虚拟环境配置 $ vi pyvenv.cfg -------------------------------------- home = /usr/bin include-system-site-packages = false version = 3.5.2 --------------------------------------12345678910111213141516
2、激活虚拟环境
$ cd work $ source bin/activate # 前面有括号xx,即表示虚拟环境激活成功,在激活环境下pip安装的包单独管理,不会冲突 (work) $12345
3、退出虚拟环境
(work) $ deactivate
常见的http状态码
常见的http状态码
100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。 101: 转换协议 在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。 102:继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。 200:请求成功 处理方式:获得响应的内容,进行处理 201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到 202:请求被接受,但处理尚未完成 处理方式:阻塞等待 204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃 300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃 301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL 302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL 304:请求的资源未更新 处理方式:丢弃,使用本地缓存文件 400:非法请求 处理方式:丢弃 401:未授权 处理方式:丢弃 403:禁止 处理方式:丢弃 404:没有找到 处理方式:丢弃 500:服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。 501:服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。 502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。 503:服务出错 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。
- 【资料整理】CentOS5.6 升级 Python2.4.3 到 2.7.5
- python入门学习资料整理(链接汇总,不断更新)
- 你需要这些:Python3.x爬虫学习资料整理
- Python|爬虫学习资料整理
- python3 爬虫资料整理
- 整理网上python解析xml文件相关资料汇总
- Python yield资料整理
- Python下OpenCV批量调整图片大小——整理分团委资料的小技巧
- python视频学习001(2017年老男孩最新全栈python第2期视频教程)---学习感悟和学习资料整理
- Python Restful API 资料整理
- 一位大牛整理的Python资料
- 【资料整理】shell调用python中文字符问题
- 一个月能入门Python吗?月薪25K的大佬给我整理了函数和模块资料
- python学习资料整理
- 【资料整理】python发送邮件
- python的基础学习—个人整理资料
- python爬虫资料整理
- python+Scrapy爬虫编程环境配置的资料整理
- python学习资料整理
- [置顶] 【python 资料整理】机器学习、数学、Python 速查表