一、初始化django项目
1、安装和启动
1.1 安装django
> pip inistall django==2.2.9 -i https://pypi.doubanio.com/simple
- 查询Django安装的版本
> python -m django --version
1.2 创建和启动django
创建&启动 方式一:
1. 开启一个django项目
> django-admin startproject django1906
2. 使用PyCharm打开项目并创建虚拟环境
- 方式1: File -- Settings -- Project -- Project Interpreter -- Add
- 方式2: 在终端执行:python -m venv venv / virtualenv
3. 安装项目所需依赖项
> pip install -r requirements.txt -i https://pypi.doubanio.com/simple
4. 运行项目
Add Configuration --> + --> Python
> python manage.py runserver
# --> Script Path (manage.py)
# --> Parameters (runserver)
创建&启动 方式二:
1. 用PyCharm创建一个普通的Python项目
2. 安装Django所需的依赖项
> pip install -r requirements.txt -i https://pypi.doubanio.com/simple
3. 把Python项目变成Django项目
> django-admin startproject django1906 .
4. 运行项目
> python manage.py runserver
~ Add Configuration --> + --> Python
创建&启动 方式三:
1. 克隆项目到本地
~ 使用PyCharm的"get from version control"
~ git clone [email protected]:jackfrued/django1906.git
2. 创建虚拟环境
~ Linux/macOS: source venv/bin/activate
~ Windows: "venv/Scripts/activate"
3. 重建依赖项
> pip install -r requirements.txt -i https://pypi.doubanio.com/simple
4. 运行项目
> python manage.py runserver
~ Add Configuration --> + --> Python
1.3 生成项目依赖项文件:
- 追加项目所需依赖项到依赖项文件
pip freeze > requirements.txt
- 根据依赖项清单安装项目所需依赖项
pip install -r requirements.txt
1.4 .gitignore忽略文件
去该网站生成 gitignore内容
https://gitignore.io/
2、初始化django项目配置
2.1 创建应用
方式1: python manage.py startapp 应用名字
方式2: django-admin startapp 应用名字
2.2 创建数据库
- 创建数据库
> create database django1906 default charset utf8 collate utf8_bin;
- 创建用户
> create user 'jackfrued'@'%' identified by '123456';
- 给用户授权
> grant all privileges on django1906.* to 'jackfrued'@'%';
2.3 配置数据库到项目
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django1906',
'HOST': '120.77.222.217',
'PORT': 3306,
'USER': 'jackfrued',
'PASSWORD': '123456',
'CHARSET': 'utf8',
'TIME_ZONE': 'Asia/Chongqing',
}
}
2.4 在settings.py文件中将应用添加到 INSTALLED_APPS
INSTALLED_APPS = [
.....
'polls',
]
2.5 在项目主路径新建templates目录
2.5.1 在settings文件配置templates路径
2.6 在项目主路径新建static目录
2.6.1 在settings文件配置static路径
2.7 在settings文件配置时区
2.8 更新项目数据到数据库
python manage.py makemigrations polls
python manage.py migrate
2.9 向数据库添加数据:
insert into tb_subject values(default,'python+人工智能','python课程介绍'),(default,'JavaEE','JavaEE课程介绍'),(default,'HTML5+跨平台','HTML5课程介绍');
2.10 为项目创建超级管理员账号
python manage.py createsuperuser
用该账户可登陆后台 http://127.0.0.1:8000/admin
二、项目优化
1、django调试工具:django_debug-toolbar
1.1 在终端安装django_debug-toolbar:
pip install django_debug-toolbar
1.2 在settings添加配置
还需添加settings项:
DEBUG_TOOLBAR_CONFIG = {
# 引入jQuery库
'JQUERY_URL': 'https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js',
# 工具栏是否折叠
'SHOW_COLLAPSED': True,
# 是否显示工具栏
'SHOW_TOOLBAR_CALLBACK': lambda x: True,
}
1.3 urls.py中加入
if settings.DEBUG:
import debug_toolbar
urlpatterns.insert(0, path('__debug__/', include(debug_toolbar.urls)))
2、配置缓存
2.1 安装 django-redis==4.11.0
2.2 在Settings中加入:
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': [
'redis://118.190.0.120:6379/0',
],
'KEY_PREFIX': 'djang1906',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
'CONNECTION_POOL_KWARGS': {
'max_connections': 512,
},
'PASSWORD': 'yourpass',
}
},
}
# 配置使用缓存来支持用户会话
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
# 会话数据放在哪一组缓存中
SESSION_CACHE_ALIAS = 'session'
3、配置日志:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '/path/to/django/debug.log',
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
},
}
其它:
REST架构
实体 -- 数据 -- 数据接口 -- 网络API(HTTP/HTTPS)
https -- hypertext transfer protocol secure
REST架构 -- RESTful API -- 无状态, 幂等性
(幂等性:其任意多次执行对资源本身所产生的影响均与一次执行的影响相同)
REpresentational State Transfer -- 表述性状态转移
最适合互联网应用的架构
水平扩展 -- 单机结构 -- 多机结构(分布式集群)
HTTP -- 无连接无状态协议
URL -- Uniform Resource Locator -- 资源
HTTP协议 请求行:GET/POST/DELETE/PUT/PATCH
新建 post -- 不需要幂等性
查看 get
更新 put / patch
删除 delete
反向工程
1、数据库中已建好表格
2、在应用目录新建models.py文件
3、在终端输入:python manage.py inspectdb > common/models.py
4、实现数据库中表变模型
改变全局下载路径:
- 在C:\Users\Administrator 目录下创建pip文件夹
- 在pip文件夹中创建一个pip.ini文件
- 文件中写入:
[global]
index-url=https://pypi.doubanio.com/simple - 保存搞定
生成哈希摘要:
~from hashlib import md5,sha1,sha256,sha512
~uuid1()hex
~hasher=md5()
~with open('Python-3.8.1.tar.xz','rb') as file:
data = file.read(4096)
while data:
hasher.update(data)
data=file.read(4096)
print(hasher.hexdigest())
用户跟踪
- 如果希望服务器要记住用户 可以使用以下三种辅助方式:
1. URL重写 [http://www.baidu.com/?uid=xxxx](http://www.baidu.com/?uid=xxxx)
2. 隐藏域(隐式表单域)
3. 浏览器本地存储
1) cookie - 浏览器中的一个临时文件可以保存键值对
cookie中的数据在发起http请求时会自动加载到请求头中
2) windows.localStorage / window.sessionStorage
request.session --> 服务器内存中的一个对象
cookie --> 用户浏览器临时文件 --> cookie中保存了session的ID
利用ModelViewSet创建视图集
- 增删改查全套
class HouseTypeViewSet(ModelViewSet):
queryset = HouseType.objects.all()
serializer_class = HouseTypeSerializer
- 只能读
class HouseTypeViewSet(ReadOnlyModelViewSet):
queryset = HouseType.objects.all()
serializer_class = HouseTypeSerializer
- 局部路劲配置
# 创建路由器
router = SimpleRouter()
# 注册视图集(这里路径不能加/,路由器会自动加)
router.register('housetypes', HouseTypeViewSet)
# 最后把注册好的路径列表和原列表合并
urlpatterns += router.urls
- 创建全局分页
setting中修改REST的配置
给REST_FRAMEWORK增加配置,添加分页功能
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 5,
}
如果不想被全局分页影响修改视图中的pagination_class
class HouseTypeViewSet(ModelViewSet):
queryset = HouseType.objects.all()
serializer_class = HouseTypeSerializer
# 修改默认不分页就不被全局分页所影响
pagination_class = None
给view视图集增加缓存功能
1.在类继承的多是多继承一个CacheResponseMixin
class EstateView(CacheResponseMixin, ListCreateAPIView, RetrieveUpdateDestroyAPIView):
queryset = Estate.objects.all().defer('district', 'agents')
def get_serializer_class(self):
if self.request.method in ('POST', 'PUT', 'PATCH'):
return EstatePostSerializer
else:
return EstateSimpleSerializer
def get(self, request, *args, **kwargs):
if 'pk' in kwargs:
return RetrieveAPIView.get(self, request, *args, **kwargs)
else:
return ListAPIView.get(self, request, *args, **kwargs)
2.在setting中增加一个配置代码
# 配置混入类,增加是视图集缓存功能
REST_FRAMEWORK_EXTENSIONS = {
'DEFAULT_CACHE_RESPONSE_TIMEOUT': 120,
'DEFAULT_USE_CACHE': 'default',
'DEFAULT_OBJECT_CACHE_KEY_FUNC': 'rest_framework_extensions.utils.default_object_cache_key_func',
'DEFAULT_LIST_CACHE_KEY_FUNC': 'rest_framework_extensions.utils.default_list_cache_key_func',
}
通过接口筛选数据
1、手写代码:
2、利用django-filter三方库
1)先安装:pip install django-filter
2)将django_filters添加到settings.py中的INSTALLED_APPS中
OrderingFilter -- 排序(可以不加)
filter_fields -- 通过什么筛选(后面跟元组形式)
ordering_fields -- 通过哪些字段排序
3)
class EstateView(CacheResponseMixin, ListCreateAPIView, RetrieveUpdateDestroyAPIView):
queryset = Estate.objects.all().defer('agents')
filter_backends = (DjangoFilterBackend, OrderingFilter)
filter_fields = ('district',)
ordering_fields = ('hot', 'estateid',)
通过字段范围搜索
1、自定义一个类来作为筛选条件
import re
import django_filters
from django.db.models import Q
class EstateFilterSet(django_filters.FilterSet):
"""自定义FilterSet"""
minhot = django_filters.NumberFilter(field_name='hot', lookup_expr='gte')
maxhot = django_filters.NumberFilter(field_name='hot', lookup_expr='lte')
keyword = django_filters.CharFilter(method='filter_by_keyword')
@staticmethod
def filter_by_keyword(queryset, key, value):
queryset = queryset.filter(Q(name__contains=value) |
Q(intro__startswith=value))
return queryset
2、在视图集类中加入
class EstateView(CacheResponseMixin, ListCreateAPIView, RetrieveUpdateDestroyAPIView):
queryset = Estate.objects.all().defer('agents')
# 筛选
filter_backends = (DjangoFilterBackend, OrderingFilter)
# filter_fields = ('district',)
# 通过自定义的筛选类来筛选
filterset_class = EstateFilterSet
# 排序
ordering_fields = ('hot', 'estateid',)
# 加上下面这句就不限流
# throttle_classes = ()
配置限流(全局作用)
# 在setting中的REST_FRAMWORK配置中加入
# 给REST_FRAMEWORK增加配置,添加分页功能
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 5,
# 限流配置包
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',
),
'DEFAULT_THROTTLE_RATES': {
'anon': '5/min',
},
}