前端代码

1
2
3
4
5
6
7
# src/assets/js/settings.js 改为自己的公网 IP
export default {base_url:'http://42.194.173.230:8080/api/v1/'}

# 编译
npm run build

# 将 dist 文件夹打包为 dist.zip 上传到服务器中

后端代码

luffy_api/luffy_api/setting/pro.py

1
2
3
4
5
6
7
8
1. DEBUG = False
2. ALLOWED_HOSTS = ['*']
3. MySQL连接地址和密码
这里写的是 luffy_mysql 是在docker中的 --link 参数 指定docker容器名称可以在 /etc/hosts 文件中做映射
4. Redis连接地址和密码
"redis://:admin@luffy_redis:6379",
admin 是设置的密码
luffy_redis 也是docker的 --link 参数如上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
import os
import sys
import datetime

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

sys.path.append(os.path.join(BASE_DIR, 'apps'))
sys.path.append(BASE_DIR)

SECRET_KEY = '-b4z=*^wa1rjc-5a+@+)f%t-%mppmx@vz%8zdps1$rr9r@y&$5'

DEBUG = False

ALLOWED_HOSTS = ['*']

INSTALLED_APPS = [
'simpleui',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'corsheaders',
'user',
'home',
'course',
'order',
'django_filters',
]

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'corsheaders.middleware.CorsMiddleware',
]

ROOT_URLCONF = 'luffy_api.urls'

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]

WSGI_APPLICATION = 'luffy_api.wsgi.application'

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'luffy',
'USER': 'luffy',
'PASSWORD': 'Luffy123?',
'HOST': 'luffy_mysql',
'PORT': 3306,
}
}

AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False

STATIC_URL = '/static/'

# 日志相关
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
},
},
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': {
'console': {
# 实际开发建议使用WARNING
'level': 'DEBUG',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'file': {
# 实际开发建议使用ERROR
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
# 日志位置,日志文件名,日志保存目录必须手动创建,注:这里的文件路径要注意BASE_DIR代表的是小luffyapi
'filename': os.path.join(os.path.dirname(BASE_DIR), "logs", "luffy.log"),
# 日志文件的最大值,这里我们设置300M
'maxBytes': 300 * 1024 * 1024,
# 日志文件的数量,设置最大日志数量为10
'backupCount': 10,
# 日志格式:详细格式
'formatter': 'verbose',
# 文件内容编码
'encoding': 'utf-8'
},
},
# 日志对象
'loggers': {
'django': {
'handlers': ['console', 'file'],
'propagate': True, # 是否让日志信息继续冒泡给其他的日志处理系统
},
}
}

REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 默认响应渲染类
'rest_framework.renderers.JSONRenderer', # json渲染器
# 'rest_framework.renderers.BrowsableAPIRenderer', # 浏览API渲染器
),
'EXCEPTION_HANDLER': 'utils.exception.common_exception_handler' # 再出异常,会执行这个函数
}

# 自定义User表
AUTH_USER_MODEL = 'user.User'

# 配置media
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

# 跨域问题处理
# 允许简单请求,所有地址 相当于CORS_ORIGIN_ALLOW_ALL="*"
CORS_ALLOW_ALL_ORIGINS = True
# 运行的请求
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)

# 允许的请求头
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization', # jwt
'content-type', # json
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'Pragma',
)

# 导入用户自定义配置
from .user_settings import *

JWT_AUTH = {
# 过期时间1天
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
}

# redis 配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://:admin@luffy_redis:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient", # 这句指的是django中的缓存也缓存到redis中了
"CONNECTION_POOL_KWARGS": {"max_connections": 100} # 连接池的大小
#"PASSWORD": "admin",
}
}
}

luffy_api/luffy_api/setting/user_settings.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 用户自己的配置,单独放到另一个py文件中
BANNER_COUNT = 4

# 用户自己别的配置
# 上线后必须换成公网地址
# 后台基URL
BASE_URL = 'http://42.194.173.230:8080'
# 前台基URL
LUFFY_URL = 'http://42.194.173.230'
# 支付宝同步异步回调接口配置
# 后台post异步回调接口
NOTIFY_URL = BASE_URL + "/api/v1/order/success/"
# 前台同步回调接口,没有 / 结尾
RETURN_URL = LUFFY_URL + "/pay/success"

服务器上操作

安装docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 安装
yum install yum-utils device-mapper-persistent-data lvm2 -y
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io -y

# 启动
systemctl start docker
systemctl enable docker

# 镜像加速、更改Docker根目录
mkdir -p /data/docker # 挂载到新的硬盘上
cat >/etc/docker/daemon.json<<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {"max-size": "100m"},
"registry-mirrors" : ["https://ot2k4d59.mirror.aliyuncs.com/"],
"graph": "/data/docker"
}
EOF

# 重启docker
systemctl daemon-reload
systemctl restart docker
docker info

相关配置文件

后端配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 创建操作目录
mkdir ~/docker-luffy
cd ~/docker-luffy

# 克隆代码 检查是否如上修改了相应的配置 也可以自定义配置
yum install git -y
git clone https://gitee.com/liuzhijin1/luffy_api.git


# 准备 uwsgi文件
cat > ~/docker-luffy/luffy_api/luffyapi.xml <<EOF
<uwsgi>
<socket>0.0.0.0:8888</socket>
<chdir>/soft/</chdir>
<module>luffy_api.wsgi</module>
<processes>4</processes>
<daemonize>uwsgi.log</daemonize>
</uwsgi>
EOF


# 创建日志文件
touch ~/docker-luffy/luffy_api/uwsgi.log


# 准备 Dockerfile 文件
cat > ~/docker-luffy/Dockerfile << EOF
FROM python:3.8

WORKDIR /soft
COPY luffy_api /soft
RUN pip install --upgrade pip -i https://pypi.douban.com/simple/ && \
pip install uwsgi -i https://pypi.douban.com/simple/ && \
pip install -r requirements.txt -i https://pypi.douban.com/simple/

EXPOSE 8888
CMD uwsgi -x /soft/luffyapi.xml && tail -f /soft/uwsgi.log
EOF
制作镜像
1
2
3
4
5
# 制作镜像前一定要检查好 django 的相关配置
cd ~/docker-luffy
docker build -t luffy:v1 .

docker images
nginx相关配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# nginx的配置文件
cat ~/docker-luffy/nginx.conf
worker_processes auto;
events {
worker_connections 1024;
}
http
{
include mime.types;
default_type application/octet-stream;
charset UTF-8;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 50m;
#####################################
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
#####################################
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
#####################################
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
server_tokens off;
server {
listen 8080;
server_name 0.0.0.0;
charset utf-8;
location / {
include uwsgi_params;
uwsgi_pass luffy_api:8888;
}
location /static {
alias /usr/share/nginx/html/static;
}

location /media {
alias /usr/share/nginx/html/media;
}
}
server {
listen 80;
server_name 0.0.0.0;
charset utf-8;
location / {
root /usr/share/nginx/html/dist;
index index.html;
try_files $uri $uri/ /index.html; # 解决单页面应用刷新404问题
}
}
}

# 静态文件准备
mkdir ~/docker-luffy/webstatic -p

# 将前端代码放入
unzip dist.zip -d ~/docker-luffy/webstatic
cp -rp ~/docker-luffy/luffy_api/luffy_api/media ~/docker-luffy/webstatic

# 还有一个django 后台的页面导出放到下面文件夹内
mkdir ~/docker-luffy/webstatic/static

#### 在其他位置打包好再拿过来也可以用
# 修改配置
vim luffy_api/luffy_api/setting/pro.py
STATIC_URL = '/static/'
STATIC_ROOT = '/web/luffy/luffy_api/luffy_api/static'
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)

# 后台静态文件迁移 自动迁移到 上面创建的静态文件目录
python luffy_api/manage_pro.py collectstatic

启动项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 创建持久化文件夹
mkdir /data/luffy -p
cd ~/docker-luffy

# 启动顺序一般都是从后往前的
# 启动 mysql
docker run -itd --name luffy_mysql \
-p 3306:3306 \
-v /data/luffy/mysql_data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=Mysql123456? \
-e MYSQL_DATABASE=luffy \
-e MYSQL_USER=luffy \
-e MYSQL_PASSWORD=Luffy123? \
mysql:5.7 \
--character-set-server=utf8mb4

# 启动 redis
docker run -itd --name luffy_redis \
-p 6379:6379 \
-v /data/luffy/redis_data:/data \
redis:6.0 \
--requirepass "admin"

# 启动luffy
docker run -itd --name luffy_api \
-p 8888:8888 \
--link luffy_redis \
--link luffy_mysql \
luffy:v1

# 启动 nginx
docker run -itd --name luffy_web \
--link luffy_api \
-p 80:80 \
-p 8080:8080 \
-v /root/docker-luffy/nginx.conf:/etc/nginx/nginx.conf \
-v /root/docker-luffy/webstatic:/usr/share/nginx/html \
nginx:1.20

docker run -itd --name luffy_web \
--link luffy_api \
-p 80:80 \
-p 8080:8080 \
-v $PWD/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/webstatic:/usr/share/nginx/html \
nginx:1.20

# 运行完成后进入容器执行数据迁移命令
docker exec -it luffy_api /bin/sh
python /soft/manage_pro.py migrate

爬取梨视频

1
2
3
4
5
requests 模拟发送 http 请求
解析库进行解析,有 re bs4 lxml
requests-html: 发送请求+解析xml

视频去水印: fmmpeg模块 加水印,拼接裁剪,抠图,转码
阅读全文 »

Selenium的使用

1
2
3
4
5
6
7
8
9
10
11
requestsm模块,可以发送http请求,但是有的页面是由render+ajax渲染完的,如果只使用requestes,它只能执行render的请求,拿回数据,执行ajax的请求,需要你再去分析,再去发请求

selenium,控制浏览器,操作浏览器,完成人的行为-->自动化测试工具
本质是python通过代码,借助于浏览器驱动,操作浏览器,真正的实现了,可见即可爬

安装模块
pip3 install selenium

下载谷歌浏览器驱动(版本最接近的也可以)
https://registry.npmmirror.com/binary.html?path=chromedriver/

阅读全文 »

hello world

1
2
3
4
5
6
7
package main

import "fmt"

func main() {
fmt.Println("hello world1")
}
阅读全文 »

前端与后端

1
2
3
4
5
6
7
8
9
10
11
前端:
如何与操作系统打交道的界面都可以称为'前端'
如:手机界面 电脑软件界面 平板界面

后端:
不直接与用户打交道,而是控制核心逻辑的运行

前端三剑客
HTML 网页的骨架(没有样式)
CSS 网页的样式(给骨架美化)
JS 网页的动态效果(丰富用户体验)
阅读全文 »