Django 笔记

创建虚拟环境:
mkvirtualenv 环境名

删除虚拟环境:
rmvirtualenv 环境名

查看环境列表:
lsvirtualenv

退出当前虚拟环境:
deactivate

进入虚拟环境:
workon 环境名

根据指定python解释器安装虚拟环境(不过他是在终端所对应的那个文件夹下)
virtualenv -p D:\ProgramData\Anaconda3\envs\python36\python.exe django_heima

查看当前安装的包(等号形式):
pip freeze

安装django==1.8.2的版本
pip install django==1.8.2

创建项目:
django-admin startproject test1

python 在一个文件夹中写了 __init__.py 表示该文件夹为一个包

wsgi.py Django中后期用于项目部署的

------------------------------------------------------------------
添加应用:
python manage.py startapp booktest

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQLdb'
解决办法(Python 3.x):
第一步:pip install pymysql
第二步:在 项目目录的 __init__.py 文件中添加:
import pymysql

pymysql.install_as_MySQLdb()
第三步:就正常添加应用即可

启动服务:
python manage.py runserver

迁移相关:
第一步:注册应用:
在 setting.py 文件的 INSTALLED_APPS 中注册
(第三方应用也要在这里注册)
第二步:生成迁移:
python manage.py makemigrations
第三步:执行迁移(用来创建表):
python manage.py migrate

类的 __str__(self) 方法的返回值,为类的属性

------------------------------------------------------------------
Django后台管理相关:
添加管理员:
python manage.py createsupperuser

No module named 'django.urls':
修改 urls.py 文件:
from django.conf.urls import url
urlpatterns = [
url('admin/', admin.site.urls),
]

'WSGIRequest' object has no attribute 'user':
这是由于Django版本的问题,在1.10之前,中间件的key为MIDDLEWARE_CLASSES;在1.10之后,中间件的key为MIDDLEWARE

python3.x 的默认编码是utf-8所以在处理 __str__ 的返回值的时候不用使用 encode('utf-8')

------------------------------------------------------------------
视图的定义中函数必须跟request参数

在HTML文件中使用两个大括号 {{}} 表示直接输出;
使用大括号加百分号 {%%} 表示运行python代码

detail() takes 1 positional argument but 2 were given
问题原因:传递了两个参数过去,不过只接受了一个参数,
解决办法:在view.py 的函数中多接受一个参数

------------------------------------------------------------------
ORM(对象-关系-映射):
可以通过对象来直接操作关系型数据库

可以在模型类中通过
class Meta: db_table 来指定表的名字
class Meta: ordering 来指定排序规则

objects = models.Manager() # 数据库查询的接口

模型类不能直接和数据库做交互,
通过模型类中的管理器用于和数据库做交互
自定义管理器对象,重写 get_queryset() 方法可以更改默认查询集,对我们的查询进行一些条件判断

可以在模型类中定义一个类方法或者在管理器中定义一个对象方法用于快捷创建对象

自定义了管理器就不能再使用Django定义的管理器了(objects)

管理器是模型类的属性,用于将对象与数据表交互

------------------------------------------------------------------
exclude() 不包含的
filter() 过滤器(里面可以跟多个条件,直接连接相当于逻辑与)
values() [{对象},{对象}] (JSON)

get() 返回满足条件的一个对象
count() 返回当前查询集的总条数
first() 返回第一个对象
last() 返回最后一个对象

惰性执行(用到数据的时候才会真真去拿)、查询集缓存

exact 判断相等,默认可以不写
contains 判断包含的
startswith 查询以什么开头
endswith 查询以什么结尾
加上i表示不区分大小写
in 表示在返回内
gt,gte,lt,lte 大于,大于等于小于,小于等于

list.aggregate() # 使用聚合函数

F对象
作用:将两个字段进行比较的时候使用,还可以将F对象的列进行运算
EG: list.filter(bread_gte=F('bcomment')) # 找阅读数大于等于评论数的数据

Q对象
作用:可以将条件进行逻辑或运算
EG:list.filter(Q() | Q()) # 逻辑或
EG:list.filter(Q() & Q()) # 逻辑与

------------------------------------------------------------------
事务用来保证业务逻辑的完整性(innoeDB)

where 中用到了哪些字段就在哪些字段上面建索引,可以加快数据的搜索

路由(?P<id>\d+) 表示将id作为参数传入

可以给url和include取名字,可以用于反向解析

404模板在templates 目录下配置 404.html 文件作为404 文件

request_path 请求的完整路径
request_method 请求的方式
request_encoding 提交数据的编码方式
request_GET 类似字典,接受get请求方式的所有参数
request_COOKIES 一个标准的字典,包含所有的cookie
request_session 用于保存当前会话

链接中写了斜杠表示从更目录去匹配

一键多值通过 request.GET 方式只能获取最后一个的值

request.GET.getlist() 获取一键多值的值

request.POST.getlist() 接受 POST 中的一键多值

------------------------------------------------------------------
Response 数据响应

模板使用分为两步:
模板加载(loader),数据渲染(render)

content-type: 指定输出的MIME类型

cookie 存储在浏览器中的数据

response.set_cookie(key, value)
cookie 默认两个星期后过期

python3判断字典中是否有某个key: 'key' in dict.keys()

response.write('显示的内容') 将数据返回到页面中

想要获取其他网站在浏览器中储存的cookie值可以通过内嵌其它网站的访问来实现

response.delete_cookie(key) 删除cookie

JsonResponse 返回JSON格式的数据

"""
redirect是继承之HttpResponse 的,所以可以将cookie值设置到这个对象中
"""
obj = redirect("/index/")
obj.set_cookie("is_login", True, 30) # cookie有效期为30秒
obj.set_cookie("username", user_obj.username)
return obj

------------------------------------------------------------------
# 模板的调用流程
def resp(request):
# 加载模板
temp = loader.get_template('booktest/resp.html')
# 定义上下文数据
context = RequestContext(request, {"text":"helloworld"})
# 渲染模板
return HttpResponse(temp.render(context))

------------------------------------------------------------------
通过 cookie 和 session 都可以使状态保持

session 也是字典
get 获取session
clear 清除所有session
flush 删除当前会话的session

Django中session中的数据同步存在 django_session 表中的

request.session['key'] 获取或者设置 session中的值

session 删除:
del request.session['myname']

设置session存活时间 request.session.set_expiry()

------------------------------------------------------------------
可以通过配置setting.py 文件指定Django中的session存在redis中
1.在虚拟环境中安装包
pip install django-redis-sessions
2.在Django项目的settings文件中增加下面的配置
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS = {
'host': 'localhost',
'port': 6379,
'db': 1,
'password': '',
'prefix': 'session',
'socket_timeout': 10
}

Redis 可以通过 select 1 来选择1这个数据库

session依赖于cookie

------------------------------------------------------------------
DTL (Django的模板语言)

一般想让应用具有可移植性,就将 templates 放在应用目录下

浏览器操作前端的过程是渲染、执行

render_to_string("直接返回字符串到页面")

在模板中调用方法时,不能跟括号 func,所以模板中不能传递参数

{%for .. in ..%}
循环逻辑
{%empty%}
如果循环为空,则执行empty里面的东西
{%endfor%}

{%if ..%}
满足IF条件的执行
{%elif ..%}
满足elif条件的执行
{%else%}
都不满足条件时执行
{%endif%}

{{forloop.counter}} 打印当前第几次

# 判断值是否被2整除
{%value|divisibleby:"2"%}

模板运算要用过滤器

# 将模板包含过来
{%include "模板.html"%}

# 防止跨站攻击
{%csrf_token%}

# 反向解析
{%url 'name'%}

# 日期格式化输出
{{value|date:'Y-m-d'}}

------------------------------------------------------------------
反向解析:根据一个url来匹配一个地址(通过我们定义的namespace和name动态生成链接)
{% url 'booktest:show' 参数1 参数2 %}

通过 {% block 名称 %} 来挖坑,再通过 {% block 名称 %} 来在另一个模板中填坑

# 模板继承:
{% extends 'booktest/muban.html'%}

坑可以在多重继承后来填充

用了模板继承,想添加内容必须写到坑 block 对应的位置

------------------------------------------------------------------
模板默认进行了HTML转义

{{value|safe}} 不转义

使用default过滤器指定默认值
{{value|default:'默认值'}}

CSRF 跨站请求伪造

当提交表单的时候跟上 {csrf_token} 可以解决跨站请求伪造

图像绘制的流程:
创建画布
创建画笔
获取字体对象

# 配置在页面上请求的静态文件路径
STATIC_URL = '/static/'

# 指定静态文件的绝对路径
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]

------------------------------------------------------------------
Django中通过中间件的形式实现面向切面编程(IOC DI)

其中中间件就是Django提供的一个类

使用中间件可以干扰请求响应的过程

__init__() # 第一次访问的时候
process_request() # 请求到来之前
process_view() # url到view的过程中
process_exception() # 视图错误走到这
process_template_response() # view到temp的过程中
process_response() # 响应

我们可以自己定义一个类添加到中间件中就可以起作用

------------------------------------------------------------------
request.FILES 获取上传的图片

上传图片需要依赖于 pillow这个包

admin的模板样式可以在自己项目中改

通过 Paginator(页码)、Page(每页的数据) 可以实现分页

paginator.page_range 当前的页码

models.ForeignKey('self') 指定自关联

$('#id').empty().append()

------------------------------------------------------------------
第三方库,富文本编辑器的使用:
第一步,安装包
pip install django-tinymce
第二步,将tinymce加入到INSTALLED_APPS 中
第三步,创建模型,使用 tinymce.models 中的HTMLField() 指定一个大的字段
PS:在模板中使用tinymce富文本
第一步:模板的定义
<script type="text/javascript" src='/static/tiny_mce/tiny_mce.js'></script>
<script type="text/javascript">
tinyMCE.init({'mode': 'textareas','theme': 'advanced','width':400,'height':100});
</script>
<form method="post" action="/content/">
<input type="text" name="hname">
<textarea name= 'hcontent'>哈哈,这是啥呀</textarea>
<input type="submit" value="提交">
</form>
第二步、将tinymce中的static文件夹中的数据复制到Django项目的static目录中

------------------------------------------------------------------
将数据缓存到 Redis中
第一步:安装redis
pip install django-redis-cache
第二步:配置cache
CACHES = {
'default': {
'BACKEND': 'redis_cache.cache.RedisCache', # 指定缓存使用的引擎
'LOCATION': 'localhost:6379',
'TIMEOUT': 60,
}
}

Django中默认使用Redis中的1那个数据库

缓存视图,在视图函数上面添加 @cache_page() 装饰器

可以将模板中的片断缓存起来

也可以将数据进行缓存

cache.clear() 清除数据库中的所有缓存
cache.delete(键) 清除这个键对应的缓存
cache.set(键, 值, 有效时间) 设置缓存
cache.get(键) 获取缓存

------------------------------------------------------------------
使用全文检索不同于特定字段的模糊查询,他的效率更高,并且能对中文进行分词

通过haystack和搜索引擎做交互可以进行全文检索

django-haystack + whoosh + jieba 实现全文检索
pip install django-haystack
pip install whoosh
pip install jieba

pip install django-haystack 报错
ERROR: Command errored out with exit status 1:
command: 'F:\virtualenv\django_heima\Scripts\python.exe' -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\Admin\\AppData\\Local\\Temp\\pip-install-ao9a93bt\\djang
o-haystack\\setup.py'"'"'; __file__='"'"'C:\\Users\\Admin\\AppData\\Local\\Temp\\pip-install-ao9a93bt\\django-haystack\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);
code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base 'C:\Users\Admin\AppData\Local\Temp\pip-install-ao9a93bt\d
jango-haystack\pip-egg-info'
解决办法:
pip install setuptools-scm
pip install django-haystack

通过 python manage.py rebuild_index 生成索引
通过 python manage.py update_index 更新索引
全文检索参考: https://www.jianshu.com/p/a236f8fc8f5e

报错 from haystack import connections
ImportError: cannot import name 'connections'
将haystack卸了重新安装 2.5.1 版本

------------------------------------------------------------------
使用celery执行一个耗时的操作,实现异步

任务task:就是一个Python函数
队列queue:存储耗时的任务
代理人broker:将耗时的任务加到队列里面去,一般使用redis
工人worker:负责在一个新的进程中执行队列中的任务

pip install celery==3.1.25
pip install celery-with-redis==3.0
pip install django-celery==3.1.17

使用 celery 步骤
# 第一步:setting配置
import djcelery
# 初始化所有的 task
djcelery.setup_loader()
CELERY_TIMEZONE = 'Asia/Shanghai' # 并没有北京时区,与下面TIME_ZONE应该一致
BROKER_URL = 'redis://127.0.0.1:6379/0' # 任何可用的redis都可以,不一定要在django server运行的主机上
CELERY_IMPORTS = 'booktest.task' # 指定那个应用下面的任务被调度

# 第二步:在应用下面创建 task.py 文件
"""
celery 中的任务
"""
import time
from celery import task
"""
在函数的前面加一个celery的task装饰器就将其构造成任务了
"""
@task
def show():
print("hello")
time.sleep(5)
print("world")

第三步:执行迁移文件
python manage.py migrate

第四步:启动worker
python manage.py celery worker --loglevel=info

第五步:调用task
function.delay(parameters)


使用 celery + redis提示 AttributeError: 'str' object has no attribute 'items'
原因:Redis版本高了,解决办法,降低redis包的版本
pip install redis==2.10.6

 

posted @ 2020-04-11 21:20  GetcharZp  阅读(199)  评论(0编辑  收藏  举报