# django认证系统使用的用户模型
AUTH_USER_MODEL = "users.User"
将视图view以类的形式定义,通用类视图基类:
django.views.generic.View
urls.py中配置路由使用类视图的as_view()
方法,由dispatch()
方法具体将请求request分发至对应请求方式的处理方法中(get、post)等
方法名 | 备注 |
---|---|
create_user | 创建用户 |
authenticate | 登录验证 |
login | 记录登录状态 |
logout | 退出用户登录 |
is_authenticated | 判断用户是否登录 |
login_required装饰器 | 进行登录判断 |
Django网站
---->smtp服务器
----->目的邮箱
SMTP的全程是
Simple Mail Transfer Protocol
,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送获中转信件时找到下一个目的地,SMTP服务器就是遵循SMTP协议的发送邮件服务器,不同邮件服务商均有对应的smtp服务器地址,并且这个地址会提供给大家,方便大家使用Foxmail与outlook等专业邮件管理软件时可以用得上。
任务的发出者、中间人、任务的处理者可以在同一台电脑上启动,也可以不在同一台电脑上。处理者也需要任务的代码,任务处理者所在电脑必须有网
pip install celery
项目代码(任务发出者)
—发出任务—>
任务队列(中间人broker)redis
<—监听任务队列—任务处理者worker
1)使用
from celery import Celery
# 创建一个Celery类的实例对象
app = Celery('celery_tasks.tasks', broker='redis://172.16.179.130:6379/8')
2)发出任务
@app.task
def send_register_active_email(to_email, username, token):
# 发送邮件的代码
pass
# 发邮件:此方法会把发邮件的任务放到任务队列中
send_register_active_email.delay(email, username, token)
3)启动worker
celery -A celery_tasks.tasks worker -l info
使用itsdangerous
加密用户身份信息
1)加密码用户身份信息
# 加密用户的身份信息,生成激活token
serializer = Serializer(settings.SECRET_KEY, 3600)
info = {'confirm':user.id}
token = serializer.dumps(info)
token = token.decode()
2)解密用户身份信息
serializer = Serializer(settings.SECRET_KEY, 3600)
try:
# 根据秘钥解密
info = serializer.loads(token)
# 获取待激活用户的id
user_id = info['confirm']
# 根据id获取用户信息
user = User.objects.get(id=user_id)
user.is_active = 1
user.save()
# 跳转到登录页面
return redirect(reverse('user:login'))
except SignatureExpired as e:
return HttpResponse('激活连接已过期!')
配置:
# Django的缓存配置
CACHES = {
"default":{
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://172.16.179.142:6379/9",
"OPTIONS":{
"CLIENT_CLASS":"django_redis.client.DefaultClient",
}
}
}
# 配置sessiong存储
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
使用LoginRequireMixin:
from django.contrib.auth.decorators import login_required
class LoginRequiredMixin(object):
@classmethod
def as_view(cls, **initkwargs):
# 调用父类的as_view
view = super(LoginRequiredMinxin, cls).as_view(**initkwargs)
return login_required(view)
登录后跳转
# 获取登录后所需要跳转的地址
# 默认跳转到首页
next_url = request.GET.get('next', reverse('goods:index'))
# 跳转到next_url
response = redirect(next_url) # 重定向到新的地址
logout 函数清楚登录用户的session信息
from django_redis import get_redis_connection
con = get_redis_connection('default')
集群
启动FastDFS的方法,需要的操作
sudo service fdfs trackerd start
sudo service fsfs storaged start
sudo /usr/local/nginx/sbin/nginx
fdfs_upload_file /etc/fdfs/client.conf 要上传的图片文件
海量存储,存储容量扩展方便。
文件内容重复时只保留一份。
结合nginx提高网站访问图片的效率
# 配置文件存储类
DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage'
# 配置fdfs客户端配置文件路径
FDFS_CLIENT_CONF = './utils/fdfs/client.conf'
FDFS_SERVER_URL='http://172.16.179.131:8888/'
pip install django-haystack
pip install whoosh
②在settings.py文件中注册应用haystack并做如下配置:
INSTALLED_APPS = (
'haystack', # 全文检索框架
)
.
.
.
.
# 全文检索框架的配置
HAYSTACK_CONNECTIONS = {
'default':{
# 使用whoosh引擎
'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',
'PATH': os.path.join(BASE_DIR, 'whoosh_index')
}
}
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
class GoodsSKUIndex(indexes.SearchIndex, indexes.Indexable):
'''商品索引类'''
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
return GoodsSKU
def index_queryset(self, using=None):
return self.get_model().objects.all()
②在templates下面新建目录search/indexes/goods
③在此目录下面新建一个文件goodssku_text.txt并编辑内容如下
# 制定索引的数据行
{{ object.name }}
{{ object.desc }}
{{ object.goods.detail }}
④ 使用命令生成索引文件
python manage.py rebuild_index
脏读:某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
不可重复读(Non-replacetable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原油的数据。
幻读(Phantom Read):在一个事务的两次查询中数据不一致,例如有一个事务查询了几行数据,而另一个事务却在此时插入了新的几行数据,先前的事务在接下来的查询中,就会发现有几行数据是它先前所没有的。
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
sudo service mysql restart
多个用户同事请求数据库
(1)悲观锁
select * from df_goods_sku where id = 17 for update;
悲观锁获取数据时对数据进行了锁定,其他事务要想获取锁,必须等原事务结束。
(2)乐观锁
查询时不锁数据,提交更改时进行判断
update df_goods_sku set stock=0,sales=1 where id=17
冲突比较少的时候,使用乐观锁
冲突比较多的时候,使用悲观锁
遵循wsgi协议的web服务器
DEBUG=FALSE
ALLOWED_HOSTS=P['*']
[uwsgi]
#使用nginx连接时使用
#socket=127.0.0.1:8080
#直接做web服务器使用
http=127.0.0.1:8080
#项目目录
chdir=/Users/smart/Desktop/dj/bj17/dailyfresh
#项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=dailyfresh/wsgi.py
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uwsgi.log
virtualenv=/Users/smart/.virtualenvs/dailyfresh
location/{
include uwsgi_params;
uwsgi_pass_uwsgi服务器的ip:port
}
django 收集静态文件的命令:
python manage.py collectstatic
执行上面的命令会把项目中所使用的静态文件收集到STATIC_ROOT指定的目录下。
收集完静态文件之后,让nginx提供静态文件,需要在nginx配置文件中增加如下配置:
location /static {
alias /var/www/dailyfresh/static/;
}