Django
主要思路
import pymysqlpymysql.install_as_MySQLdb()
导包
pip install -r requirements.txt
数据库
setting - 导包(pymysql,sqlclient)-创建app(表) - settingApp - model-表细分,migrate命令-生成表(自带默认表)
修改默认表内容/自定义新表 makemigrations migrate
抽象字段
成功截图
xadmin
课程网
留言板
Django自带管理后台
xAdmin后台
初步配置(激活站点)
版本依赖
python-3.7 xadmin-github上下载
导包
配置前端媒体文件
path('admin/', admin.site.urls),path('xadmin/', xadmin.site.urls),url(r'^media/(?P<path>.*)$', serve, {"document_root": MEDIA_ROOT})
配置在项目底下的setting-installapps'crispy_forms','xadmin.apps.XAdminConfig',
migrate
生成表
路由映射
from django.contrib import adminfrom django.urls import pathfrom django.views.static import serveimport xadminfrom .settings import MEDIA_ROOTfrom django.conf.urls import urlurlpatterns = [path('admin/', admin.site.urls),path('xadmin/', xadmin.site.urls),url(r'^media/(?P<path>.*)$', serve, {"document_root": MEDIA_ROOT})]
访问
127.0.0.1:8000/xadmin
应用2(让站点和表对应起来)
courses
adminx.py
import xadminfrom apps.courses.models import Courseclass CourseAdmin(object):passxadmin.site.register(Course, CourseAdmin)
adminx.py
import xadminfrom apps.organizations.models import Teacher, CourseOrg, Cityclass TeacherAdmin(object):list_display = ['org', 'name', 'work_years', 'work_company']search_fields = ['org', 'name', 'work_years', 'work_company']list_filter = ['org', 'name', 'work_years', 'work_company']class CourseOrgAdmin(object):list_display = ['name', 'desc', 'click_nums', 'fav_nums']search_fields = ["name", "desc", 'click_nums', 'fav_nums']list_filter = ["name", "desc", 'click_nums', 'fav_nums']class CityAdmin(object):# 设置显示列list_display = ["id", "name", "desc"] # 设置搜索字段search_fields = ["name", "desc"] # 设置过滤器list_filter = ["name", "desc", "add_time"] # 设置哪些字段可以直接修改list_editable = ["name", "desc"]xadmin.site.register(Teacher, TeacherAdmin)xadmin.site.register(CourseOrg, CourseOrgAdmin)xadmin.site.register(City, CityAdmin)
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
安装成功
第二种
brew install redisbrew services start redis
开启服务
客户端
重新打开一个terminal输入命令redis-cli 打开客户端。客户端才是可以对redis执行界面操作的地方。
设置密码
关闭服务和客户端
在客户端命令输入shutdown来关闭服务,另外还可以直接kill进程
卸载redis
redis基本数据类型
String(字符串)<br /> List(列表)<br /> Hash(字典)<br /> Set(集合)<br /> Sorted Set(有序集合)
常用命令
存取(增查)set key valueget key给value追加内容append key 追加内容
SET key value 设置key=valueGET key 获得键key对应的值GETRANGE key start end 得到字符串的子字符串存放在一个键GETSET key value 设置键的字符串值,并返回旧值GETBIT key offset 返回存储在键位值的字符串值的偏移MGET key1 [key2..] 得到所有的给定键的值SETBIT key offset value 设置或清除该位在存储在键的字符串值偏移SETEX key seconds value 键到期时设置值SETNX key value 设置键的值,只有当该键不存在SETRANGE key offset value 覆盖字符串的一部分从指定键的偏移STRLEN key 得到存储在键的值的长度MSET key value [key value...] 设置多个键和多个值MSETNX key value [key value...] 设置多个键多个值,只有在当没有按键的存在时PSETEX key milliseconds value 设置键的毫秒值和到期时间INCR key 增加键的整数值一次INCRBY key increment 由给定的数量递增键的整数值INCRBYFLOAT key increment 由给定的数量递增键的浮点值DECR key 递减键一次的整数值DECRBY key decrement 由给定数目递减键的整数值APPEND key value 追加值到一个键DEL key 如果存在删除键DUMP key 返回存储在指定键的值的序列化版本EXISTS key 此命令检查该键是否存在EXPIRE key seconds 指定键的过期时间EXPIREAT key timestamp 指定的键过期时间。在这里,时间是在Unix时间戳格式PEXPIRE key milliseconds 设置键以毫秒为单位到期PEXPIREAT key milliseconds-timestamp 设置键在Unix时间戳指定为毫秒到期KEYS pattern 查找与指定模式匹配的所有键MOVE key db 移动键到另一个数据库PERSIST key 移除过期的键PTTL key 以毫秒为单位获取剩余时间的到期键。TTL key 获取键到期的剩余时间。RANDOMKEY 从Redis返回随机键RENAME key newkey 更改键的名称RENAMENX key newkey 重命名键,如果新的键不存在TYPE key 返回存储在键的数据类型的值。
可视化工具
整合spring
配置信息
#ip地址redis.hostName=127.0.0.1#端口号redis.port=6379#如果有密码redis.password=#客户端超时时间单位是毫秒 默认是2000redis.timeout=2000#最大空闲数redis.maxIdle=10#连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotalredis.maxActive=10#控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性redis.maxTotal=10#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。redis.maxWaitMillis=1000#连接的最小空闲时间 默认1800000毫秒(30分钟)redis.minEvictableIdleTimeMillis=300000#每次释放连接的最大数目,默认3redis.numTestsPerEvictionRun=1024#逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1redis.timeBetweenEvictionRunsMillis=30000#是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个redis.testOnBorrow=false#在空闲时检查有效性, 默认falseredis.testWhileIdle=false
实用工具类
redis包
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version> 4.12</version></dependency>
1.注解

@Cacheable(value = "aboutUser", key = "'user_'+#pageSize+#pageNumber")
2.序列化和反序列化
实体类需要实现序列化接口implement Serializable
3.配置类
package com.example.demo.config;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.cache.annotation.EnableCaching;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.cache.RedisCacheConfiguration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.cache.RedisCacheWriter;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.serializer.*;import java.time.Duration;@Configuration@EnableCachingpublic class CacheConfig extends CachingConfigurerSupport {private RedisSerializer<String> keySerializer() {return new StringRedisSerializer();}private RedisSerializer<Object> valueSerializer() {return new GenericJackson2JsonRedisSerializer();}@Beanpublic CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();redisCacheConfiguration = redisCacheConfiguration.entryTtl(Duration.ofMinutes(30L)).disableCachingNullValues().serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer())).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer((valueSerializer())));return RedisCacheManager.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory)).cacheDefaults(redisCacheConfiguration).build();}}
ps:或者直接在springboot启动类上加上@EnableCaching
注解的几种形式
//查存@Cacheable(key="'category '+#p0.offset + '-' + #p0.pageSize ")//查@Cacheable(key="'category '+ #p0")//@CacheEvict(allEntries=true)//删除@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》
总的来说,教程很精彩,也很丰富,将很多板块的内容都综合到了一起,项目的综合应用程度是很高的。











