USER_NAME = 'chd'
PASSWORD = 123456
思考这样一个问题,如何在Python文件中调用settings.py文件中的这两个参数??
-1.涉及到scrapy时,解决方法如示:
通过Settings对象的方法:从scrapy.conf中导入settings.py,并使用其中的参数设置
from scrapy.conf import settings
username = settings.get('USER_NAME') 有时会这样写self.settings.get('USER_NAME')
password = settings.get('PASSWORD')
-2.涉及到Django时,解决方法如示:
from django.conf import settings
调用方法:settings.configure,configure() 可以设置任何配置项,每个参数对应一个值。参数名称必须大写,而且参数名必须是真实存在
username = settings.USER_NAME
password = settings.PASSWORD
# 获取cookie
cookies_ct = requests.utils.dict_from_cookiejar(session.cookies)
# 将cookie保存至本地文件
with open(settings.COOKIE_PATH, "w") as fp:
json.dump(cookies_ct, fp)
# -*- coding:utf-8 -*-
# redis数据库连接
from redis import StrictRedis
-连接方式一:StrictRedis对象
redis = StrictRedis(host='localhost', port=6379, db=0, password=None)
redis.set('lover', 'woman')
print(redis.get('name'))
print(redis.get('lover'))
print(redis.get('age'))
-连接方式二:
from redis import ConnectionPool
pool = ConnectionPool(host='localhost', port=6379, db=0, password=None)
redis = StrictRedis(connection_pool=pool)
redis.set('lover', 'woman')
print(redis.get('name'))
print(redis.get('lover'))
print(redis.get('age'))
说明:
django默认将session信息存储在数据库中,我们需要通过修改settings.py配置文件,然后将session存储到redis中
-1 安装依赖包:
pip install django-redis-sessions
-2 修改settings.py配置文件
# 设置使用redis存储session信息
SESSION_ENDINE = 'redis_sessions.session'
# redis服务的ip地址
SESSION_REDIS_HOST = 'loaclhost'
# redis服务的端口
SESSION_REDIS_PORT = 6379
# redis使用哪个数据库
SESSION_REDIS_DB = 2
# redis密码
SESSION_REDIS_PASSWORD = ''
# redis存储信息前缀
SESSION_REDIS_PREFIX = 'session'
-3 测试,操作session信息
--打开APP_name/views.py文件,创建set_session,get_session的视图
from django.http import HttpResponse
def set_session(request):
"""设置session"""
request.session['name'] = name
return HttpResponse('设置session')
def get_session(request):
"""获取session"""
uname = request.session['name']
return HttpResponse(ame)
# -*- coding:utf-8 -*-
# 一、redis数据库连接
from redis import StrictRedis
# 连接方式一:StrictRedis对象
redis = StrictRedis(host='localhost', port=6379, db=3, password=None)
redis.set('lover', 'woman')
redis.set('beatutiful','pretty')
print(redis.get('name'))
print(redis.get('lover'))
print(redis.get('age'))
# 二、键的操作
# 判断键是否存在:
print(redis.exists('age'))
# 删除某个键
print(redis.delete('content'))
# 判断键的类型
print(redis.type('beatutiful'))
# 获取当前数据库的键的数目
print(redis.dbsize())
# 设定键的过期时间 ,单位为秒,-1表示永不过期
print(redis.expire('name',300))
# 获取键的过期时间,单位为秒
print(redis.ttl('name'))
# 将键移动到其它数据库:move(键名,数据库代号)
redis.move('age',db=1)
# 三、字符串的操作
# set(name,value):给数据库中键名为name的string赋予值value
redis.set('name','bob')
redis.set('age',20)
# 返回数据库中键名为name的string的值value
print(redis.get('name'))
# 返回多个键对应的value组成的列表
print(redis.mget(['name','age','lover']))
# 四、列表操作
# 在键名为name的列表末尾添加值为value的元素,也可传入多个
redis.rpush('list', 1, 2, 3, 4)
# 在键名为name的列表头部添加值为value的元素,也可传入多个
redis.lpush('list', -1, 0)
# 返回列表的长度
print(redis.llen('list'))
# 返回索引start与end之间的内容(索引从角标1开始)
print(redis.lrange('list', 1, 3))
print(redis.lrange('list',1,6))
# 连接方式二:
from redis import ConnectionPool
pool = ConnectionPool(host='localhost', port=6379, db=0, password=None)
redis = StrictRedis(connection_pool=pool)
redis.set('lover', 'woman')
print(redis.get('name'))
print(redis.get('lover'))
print(redis.get('age'))
# 五、集合操作:元素是不重复的
# 向键名为name的集合中添加元素
redis.sadd('tags','book','tea','coffee')
redis.sadd('tags1','coffee','water')
redis.expire('tags',7200)
# 返回键名为name的集合的元素个数
print(redis.scard('tags'))
# 判断某个元素是否是键名为name的集合元素
print(redis.sismember('tags', 'book'))
print(redis.sismember('tags', 'noob'))
# 返回所有给定的键的集合的交集
print(redis.sinter('tags','tags1'))
# 返回所有给定键的集合的并集
print(redis.sunion('tags','tags1'))
# 求并集并将并集保存到新的集合中
redis.sunionstore('new_tags',['tags','tags1'])
# 返回所有给定键的集合的差集
print(redis.sdiff('tags','tags1'))
# 求差集并将差集保存到新的集合dest中
redis.sdiffstore('new_diff',['tags','tags1'])
资料网站:https://blog.csdn.net/weixin_41846320/article/details/83753667
https://www.cnblogs.com/cang12138/p/9132288.html
https://www.cnblogs.com/carrychan/p/9396997.html
redis库下载地址:https://github.com/MicrosoftArchive/redis/releases
- 3.1安装从库
解压文件后,复制一份Redis文件并重命名,当做从库
文件目录:
|----
---master_6379
---slave_6380
---slave_6381
-
3.2修改从库文件中 redis.windows.conf 的端口号
1. master_6379 不做更改 2.slave_6380文件夹中redis.windows.conf文件配置 port 6380 # 设置该从机的主机为127.0.0.1:6379 slaveof 127.0.0.1 6379 #格式为slaveof 主机的host 主机的port
3. slave_6381文件夹中redis.windows.conf文件配置 # 设置该从机的主机为127.0.0.1:6379 port 6381 slaveof 127.0.0.1 6379
4. 假设主从机是同一台计算机时,假设Master和Slave在同一台主机(即需调整从机为不同的监听端口),
Master的端口为6379,slave1的端口为6380,salve2的端口为6381.....
假设Master和Slave不在同一台主机: redis.windows.conf 文件slavesof的设置是一模一样的,各从机的监听端口设置为6379
-
3.3、安装服务,需要重新设置名称。然后去服务中,开启“redis6380”(此时就可以连接6380的库了)
redis-server --service-install redis.windows.conf --service-name Redis6380
-
3.4、知识点:
1.cmd命令进入各redis库目录下,键入命令:redis-cli -p 端口号 启动redis服务 2.键入命令 info replication 查看redis数据库相关信息包括:主机,从机属性
什么是哨兵机制
Redis集群中,如果主服务器宕机(扑街)则需要手动去重启或者切换主服务器。通过哨兵机制能实现自动监听,并在从服务器中投票选举出新的master
Redis的哨兵机制功能如下:
监控(Monitoring): 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。
提醒(Notification):当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master; 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用Master代替失效Master
-4.1 服务器(Master)配置:在redis安装目录下新建sentinel.conf文件,内容如下:
# 当前Sentinel服务运行的端口
port 26379
# 哨兵监听的主服务器
sentinel monitor mymaster 192.168.1.246 6379 2
# 3s内mymaster无响应,则认为mymaster宕机了
sentinel down-after-milliseconds mymaster 3000
# 如果10秒后,mysater仍没启动过来,则启动failover
sentinel failover-timeout mymaster 10000
# 执行故障转移时, 最多有1个从服务器同时对新的主服务器进行同步
sentinel parallel-syncs mymaster 1
# 哨兵监听需要密码认证
sentinel auth-pass mymaster test@2017
# 线程守护
daemonize no
# 日志路径
logfile "D:/gateway/log/sentinel.log"
-4.2 开启哨兵机制:
-遵循先主后备原则:开启主服务,在开启从机服务,最后开启哨兵机制服务
Redis bin目录启动哨兵机制:cmd命令进入sentinel.conf即可启动
-总结
哨兵机制只是某台服务器上的软件,只占用该台服务器的端口
一台服务器可以被多个哨兵监听,集群中每个从服务器都可以开启哨兵机制
哨兵机制至少需要3台服务器。因为master宕机后,至少要有其他服务器投从服务器一票
1.文件配置一般在config.json中,比如:用户名,账号,密码,人员信息等等
2.在settings.py 文件中导入.json文件中的配置
# 载入配置文件
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 返回当前path文件的上一级目录
with open(os.path.join(BASE_DIR,"settings.json"),"r") as f:
SETTINGS = json.load(f)
# 配置文件的内容获取
SERVER = SETTINGS["DB_CONFIG"]["DB_SERVER"]
# json格式新的调用方法:json.load(f)的变量名["对象名"]["键名"]
3.在主文件.py 中导入文件import settings
文本格式内容为:settings.SERVER,settings.PASSWORD等等
脚本目录:
|
|--core.py
|
|--settings.py
|
|--config.json
|
|--a.py
|--b.py
|
|--.gitignore
======= 详细记录一些常见易混知识点,涵盖python,Django,js,SQL,web,spider....
TCP的三次握手,四次挥手: 所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。
首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。
TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作(中断连接),在socket编程中,任何一方执行close()操作即可产生挥手操作。
挥手过程:假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,
则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。
这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。
Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。
“Server端收到ACK后,"就知道可以断开连接了"。
Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。
-%s 代表字符串占位符
-%d 代表数字占位符
-%f 默认保留6为小数位
a = (4, 5)
x, y = a
print(x, y)
b = 3
c = 4
# 拓:仅元组支持这样的的交换操作,直接传统上忽略第三方变量
b, c = c, b
print(b, c)
record = ('Dove', 'dave@qq.com', '187-1369', '158-6711')
name, email, *tel = record
print(tel)
print(email)
print(name)
# 拓:元组的遍历
for i in record:
print(i)
from collections import Counter
s = 'abcbcaccbbad'
l = ['a', 'b', 'c', 'c', 'a', 'b', 'b']
d = {'2': 3, '3': 2, '17': 2}
print(Counter(s))
print(Counter(l))
print(Counter(d))
m = Counter(s)
print(m.most_common())
print(m.most_common(3))
print('---------')
print('-'.join(sorted(m.elements())))
from collections import deque
"""
双端队列,它最大的好处就是实现了从队列头部快速增加和取出对象: .popleft(), .appendleft() 。
作为一个双端队列,deque还提供了一些其他的好用方法,比如 rotate
"""
str = 'abc123cd'
dq = deque(str)
print(dq)
dq.appendleft('left')
dq.appendleft('ojbk')
dq.append('hello')
dq.append('python')
dq.append(0)
print(dq)
print(type(dq))
raw = [1, 2, 3]
d = deque(raw)
d.extendleft([4, 5, 6])
print(d)
d.extend([7, 8, 9])
print(d) # deque([6, 5, 4, 1, 2, 3, 7, 8, 9])
r_pop = d.pop()
print(r_pop) # 9
print(d) # deque([6, 5, 4, 1, 2, 3, 7, 8])
l_pop = d.popleft()
print(l_pop) # 6
print(d) # deque([5, 4, 1, 2, 3, 7, 8])
d.rotate(3)
print(d) # deque([3, 7, 8, 5, 4, 1, 2])
str = 'i love , you ? for ever,foo,info'
str1 = str.split(' ')
print(str1)
# endwith判断以某字符结尾
filenames = ['makefile.txt', 'hello.py', 'span.c', 'kill.c++']
li = []
for name in filenames:
if name.endswith(('.py', '.c')):
li.append(name)
print(name)
print(li)
li1 = []
for name in filenames:
if name.startswith(('h', 's', 'k')):
li.append(name)
print(name)
print(li)
file = 'span.txt'
print(file[-4:])
print(file[:4:2])
url = 'https://www.taobao.com'
if url[:5] == 'http:' or url[:6] == 'https:' or url[:4] == 'ftp':
print(url)
import re
text = '11/27/2019'
if re.match('\d+/\d+/\d+', text):
print(re.findall('(\d+).*?(\d+).*?(\d+)', text))
print('yes')
else:
print('badwoman')
# -*- coding:utf-8 -*-
import time,textwrap
import re
text = 'python HELLO ,lower python,Mixed Python '
dev = re.findall('python', text, flags=re.IGNORECASE)
print(dev)
dev_1 = re.sub('python', 'dragon', text, flags=re.IGNORECASE)
print(dev_1)
"""
>>>['python', 'python', 'Python']
>>>dragon HELLO ,lower dragon,Mixed dragon
"""
s = ' hello world \n '
print(s.strip())
print(s.lstrip())
print(s.rstrip())
print(s.strip(' hello'))
str = 'hello world \n bey jiu bey'
print((str.replace(' ', '-')).replace('\n', '-'))
print(re.sub('\s+', ' ', str))
# 拓:文件读取多行数据
with open('aa.txt', 'r', encoding='utf-8') as f:
# 生成列表表达式,这种方法非常高效,不需要预先读取所有数据到一个临时列表中
lines = (line.strip() for line in f)
for line in lines:
print(line)
txt = 'hello python'
print(txt)
print(txt.ljust(20, '^'))
print(txt.rjust(20, '-'))
print(txt.center(19, '-'))
parts = ['IS', 'moby', 'c++', 'python']
print(','.join(parts))
print('--'.join(parts))
start = time.time()
a = 'china no.1'
b = 'for better'
print(a + ' ' + b)
print('a:{}--b:{}'.format(a, b))
time.sleep(1.2)
end = time.time()
print(end-start)
print(time.ctime())
s = "Look into my eyes, look into my eyes, the eyes, the eyes, \
the eyes, not around the eyes, don't look around the eyes, \
look into my eyes, you're under."
"""
textwrap.fill(s,num,initial_indent = ' ',subsequent_indent = ' ')
s:目标字符串
num:一行显示的字符数
initial_indent = ' ':表示首行缩进多少个字符
subsequent_indent = ' ':表示除首行外的所有行数缩进多少个字符
"""
print(textwrap.fill(s, 40))
print(textwrap.fill(s, 41, initial_indent=' ', subsequent_indent=' '))
要在windows上使用docker-desktop,需要打开Hyper-V;如果要运行VMware 或Oracle VM VirtualBox,需要禁用Hyper-V;鱼和熊掌不可兼得