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 git@gitee.com: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目錄

image.png

2.5.1 在settings文件配置templates路徑

image.png

2.6 在項目主路徑新建static目錄

image.png

2.6.1 在settings文件配置static路徑

image.png

2.7 在settings文件配置時區

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添加配置
image.png

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、手寫代碼:
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',
    },
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容