您的位置:首页 > 编程语言 > Python开发

Python资料整理

2018-11-25 11:03 176 查看

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 数据分析图表

http://www.jq22.com/

https://www.layui.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:服务出错 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: