WeeklyRevie_django项目学习_20200106-2020-0110


一、初始化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目录

WeeklyRevie_django项目学习_20200106-2020-0110_第1张图片
image.png

2.5.1 在settings文件配置templates路径

WeeklyRevie_django项目学习_20200106-2020-0110_第2张图片
image.png

2.6 在项目主路径新建static目录

WeeklyRevie_django项目学习_20200106-2020-0110_第3张图片
image.png

2.6.1 在settings文件配置static路径

image.png

2.7 在settings文件配置时区

WeeklyRevie_django项目学习_20200106-2020-0110_第4张图片
image.png

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添加配置
WeeklyRevie_django项目学习_20200106-2020-0110_第5张图片
image.png

WeeklyRevie_django项目学习_20200106-2020-0110_第6张图片
image.png

还需添加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、手写代码:
WeeklyRevie_django项目学习_20200106-2020-0110_第7张图片
image.png
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',
    },
}

你可能感兴趣的:(WeeklyRevie_django项目学习_20200106-2020-0110)