Django

主要思路

  1. import pymysql
  2. pymysql.install_as_MySQLdb()

导包

  1. pip install -r requirements.txt

数据库

setting - 导包(pymysql,sqlclient)-创建app(表) - settingApp - model-表细分,migrate命令-生成表(自带默认表)
修改默认表内容/自定义新表 makemigrations migrate
抽象字段

成功截图

xadmin

image.pngimage.png

课程网

image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png

留言板

image.png
image.png

Django自带管理后台

xAdmin后台

初步配置(激活站点)

版本依赖
python-3.7 xadmin-github上下载
导包
配置前端媒体文件

  1. path('admin/', admin.site.urls),
  2. path('xadmin/', xadmin.site.urls),
  3. url(r'^media/(?P<path>.*)$', serve, {"document_root": MEDIA_ROOT})
  1. 配置在项目底下的setting-installapps
  2. 'crispy_forms',
  3. 'xadmin.apps.XAdminConfig',

migrate
生成表
路由映射

  1. from django.contrib import admin
  2. from django.urls import path
  3. from django.views.static import serve
  4. import xadmin
  5. from .settings import MEDIA_ROOT
  6. from django.conf.urls import url
  7. urlpatterns = [
  8. path('admin/', admin.site.urls),
  9. path('xadmin/', xadmin.site.urls),
  10. url(r'^media/(?P<path>.*)$', serve, {"document_root": MEDIA_ROOT})
  11. ]

访问
127.0.0.1:8000/xadmin

应用2(让站点和表对应起来)


courses
adminx.py

  1. import xadmin
  2. from apps.courses.models import Course
  3. class CourseAdmin(object):
  4. pass
  5. xadmin.site.register(Course, CourseAdmin)

adminx.py

  1. import xadmin
  2. from apps.organizations.models import Teacher, CourseOrg, City
  3. class TeacherAdmin(object):
  4. list_display = ['org', 'name', 'work_years', 'work_company']
  5. search_fields = ['org', 'name', 'work_years', 'work_company']
  6. list_filter = ['org', 'name', 'work_years', 'work_company']
  7. class CourseOrgAdmin(object):
  8. list_display = ['name', 'desc', 'click_nums', 'fav_nums']
  9. search_fields = ["name", "desc", 'click_nums', 'fav_nums']
  10. list_filter = ["name", "desc", 'click_nums', 'fav_nums']
  11. class CityAdmin(object):
  12. # 设置显示列
  13. list_display = ["id", "name", "desc"] # 设置搜索字段
  14. search_fields = ["name", "desc"] # 设置过滤器
  15. list_filter = ["name", "desc", "add_time"] # 设置哪些字段可以直接修改
  16. list_editable = ["name", "desc"]
  17. xadmin.site.register(Teacher, TeacherAdmin)
  18. xadmin.site.register(CourseOrg, CourseOrgAdmin)
  19. xadmin.site.register(City, CityAdmin)

image.png

Redis

概述

redis是一个key-value数据库,它是以进程的形式存在系统中,而不是在JVM中,会比mysql快很多。
官网下载地址:https://redis.io/

安装

在终端进入下载后的目录,然后执行以下步骤:

  • 解压:tar zxvf redis-5.0.5.tar.gz
  • 移动到:sudo mv redis-5.0.5 /usr/local
  • 切换到:cd /usr/local/redis-5.0.5/
  • 编译测试:make test
  • 编译安装:make install

安装成功
第二种

  1. brew install redis
  2. brew services start redis

开启服务

以下这个界面就是安装成功了,可以看到进程的pid和端口号
image.png

客户端

重新打开一个terminal输入命令redis-cli 打开客户端。客户端才是可以对redis执行界面操作的地方。

设置密码

config set requirepass 123456

关闭服务和客户端

在客户端命令输入shutdown来关闭服务,另外还可以直接kill进程

卸载redis

brew uninstall redis

redis基本数据类型

  1. String(字符串)<br /> List(列表)<br /> Hash(字典)<br /> Set(集合)<br /> Sorted Set(有序集合)

常用命令

  1. 存取(增查)
  2. set key value
  3. get key
  4. value追加内容
  5. append key 追加内容
  1. SET key value 设置key=value
  2. GET key 获得键key对应的值
  3. GETRANGE key start end 得到字符串的子字符串存放在一个键
  4. GETSET key value 设置键的字符串值,并返回旧值
  5. GETBIT key offset 返回存储在键位值的字符串值的偏移
  6. MGET key1 [key2..] 得到所有的给定键的值
  7. SETBIT key offset value 设置或清除该位在存储在键的字符串值偏移
  8. SETEX key seconds value 键到期时设置值
  9. SETNX key value 设置键的值,只有当该键不存在
  10. SETRANGE key offset value 覆盖字符串的一部分从指定键的偏移
  11. STRLEN key 得到存储在键的值的长度
  12. MSET key value [key value...] 设置多个键和多个值
  13. MSETNX key value [key value...] 设置多个键多个值,只有在当没有按键的存在时
  14. PSETEX key milliseconds value 设置键的毫秒值和到期时间
  15. INCR key 增加键的整数值一次
  16. INCRBY key increment 由给定的数量递增键的整数值
  17. INCRBYFLOAT key increment 由给定的数量递增键的浮点值
  18. DECR key 递减键一次的整数值
  19. DECRBY key decrement 由给定数目递减键的整数值
  20. APPEND key value 追加值到一个键
  21. DEL key 如果存在删除键
  22. DUMP key 返回存储在指定键的值的序列化版本
  23. EXISTS key 此命令检查该键是否存在
  24. EXPIRE key seconds 指定键的过期时间
  25. EXPIREAT key timestamp 指定的键过期时间。在这里,时间是在Unix时间戳格式
  26. PEXPIRE key milliseconds 设置键以毫秒为单位到期
  27. PEXPIREAT key milliseconds-timestamp 设置键在Unix时间戳指定为毫秒到期
  28. KEYS pattern 查找与指定模式匹配的所有键
  29. MOVE key db 移动键到另一个数据库
  30. PERSIST key 移除过期的键
  31. PTTL key 以毫秒为单位获取剩余时间的到期键。
  32. TTL key 获取键到期的剩余时间。
  33. RANDOMKEY Redis返回随机键
  34. RENAME key newkey 更改键的名称
  35. RENAMENX key newkey 重命名键,如果新的键不存在
  36. TYPE key 返回存储在键的数据类型的值。

可视化工具

mac在appStore进行下载即可
image.png

整合spring

配置信息

  1. #ip地址
  2. redis.hostName=127.0.0.1
  3. #端口号
  4. redis.port=6379
  5. #如果有密码
  6. redis.password=
  7. #客户端超时时间单位是毫秒 默认是2000
  8. redis.timeout=2000
  9. #最大空闲数
  10. redis.maxIdle=10
  11. #连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal
  12. redis.maxActive=10
  13. #控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性
  14. redis.maxTotal=10
  15. #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
  16. redis.maxWaitMillis=1000
  17. #连接的最小空闲时间 默认1800000毫秒(30分钟)
  18. redis.minEvictableIdleTimeMillis=300000
  19. #每次释放连接的最大数目,默认3
  20. redis.numTestsPerEvictionRun=1024
  21. #逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
  22. redis.timeBetweenEvictionRunsMillis=30000
  23. #是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
  24. redis.testOnBorrow=false
  25. #在空闲时检查有效性, 默认false
  26. redis.testWhileIdle=false

实用工具类

另一篇笔记

redis包

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-test</artifactId>
  8. <scope>test</scope>
  9. </dependency>
  10. <dependency>
  11. <groupId>junit</groupId>
  12. <artifactId>junit</artifactId>
  13. <version> 4.12</version>
  14. </dependency>

1.注解

image.png

  1. @Cacheable(value = "aboutUser", key = "'user_'+#pageSize+#pageNumber")

2.序列化和反序列化

实体类需要实现序列化接口implement Serializable

3.配置类

  1. package com.example.demo.config;
  2. import org.springframework.cache.CacheManager;
  3. import org.springframework.cache.annotation.CachingConfigurerSupport;
  4. import org.springframework.cache.annotation.EnableCaching;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.data.redis.cache.RedisCacheConfiguration;
  8. import org.springframework.data.redis.cache.RedisCacheManager;
  9. import org.springframework.data.redis.cache.RedisCacheWriter;
  10. import org.springframework.data.redis.connection.RedisConnectionFactory;
  11. import org.springframework.data.redis.serializer.*;
  12. import java.time.Duration;
  13. @Configuration
  14. @EnableCaching
  15. public class CacheConfig extends CachingConfigurerSupport {
  16. private RedisSerializer<String> keySerializer() {
  17. return new StringRedisSerializer();
  18. }
  19. private RedisSerializer<Object> valueSerializer() {
  20. return new GenericJackson2JsonRedisSerializer();
  21. }
  22. @Bean
  23. public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
  24. RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
  25. redisCacheConfiguration = redisCacheConfiguration.entryTtl(Duration.ofMinutes(30L))
  26. .disableCachingNullValues()
  27. .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))
  28. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer((valueSerializer())));
  29. return RedisCacheManager
  30. .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
  31. .cacheDefaults(redisCacheConfiguration).build();
  32. }
  33. }

ps:或者直接在springboot启动类上加上@EnableCaching

注解的几种形式

  1. //查存
  2. @Cacheable(key="'category '+#p0.offset + '-' + #p0.pageSize ")
  3. //查
  4. @Cacheable(key="'category '+ #p0")
  5. //
  6. @CacheEvict(allEntries=true)
  7. //删除
  8. @CacheEvict(allEntries=true)

AOF和RDB持久化处理

vi /etc/sysctl.conf
添加 vm.overcommit_memory=1
立即生效 sysctl -p

关于排错和其他的一些感想

排错

反复整体检对,局部检对 , 点对点检对
完全一致原则,模仿再超越

感想

经过了这个项目,对于django整站建站的思维又有了新的启发,是一个比较成熟的项目,而且都是django的手法
尤其是比较特性的地方,例如说django已经封装好的login,logout。确实是极大地封装了业务代码,不过话说回来如果业务结构调整成一些比较复杂的个性化权限,不知道django还能不能做到如此方便,这个以后有机会我会继续研究。
模版和路由。这两个也是比较特殊的,整个django应用是一对多的关系,一用来转发主路由,其它的应用用来做个性化路由,比如说路由的正则,分组,反向解析。
还有Django自带的admin权限管理,装配Xadmin。可以说是非常高度的封装,不愧是python。
在线服务器的部署,把Linux这个大版块拉了出来,nginx等等 实现了项目从开发到上线的流程。
在做的过程中,比较遗憾的是短信这个没有做完善,因为短信api需要备案等等,没有充分的材料提交,所以就搁置了。

以下我写的一些相关教程,是项目上线到运维会用到的相关知识。
https://www.yuque.com/books/share/92aef50d-ec78-4241-b92f-c5a4e5a8487f?# 《Linux》
https://www.yuque.com/books/share/9a1a17c3-fdc6-406e-9c79-f377b9a4d10e?# 《Docker》

总的来说,教程很精彩,也很丰富,将很多板块的内容都综合到了一起,项目的综合应用程度是很高的。