1 路飞项目使用auth的user表
-第一从一开始就使用
-后期要用,必须删库,删迁移文件(自己app内置app)
2 前端配置
-axios
-vue-router
-elementui
-bootstrap
-jq
4 跨域问题(前后端分离项目不可避免的)
-浏览器的同源策略,安全策略
-解决跨域问题
-cors:跨域资源共享,后端技术---使用了第三方插件
-前端代理(node起了一个服务)测试阶段用
-正向代理,反向代理
-jsonp:img,script标签
-nginx转发
5 简单请求和非简单请求
1 cors和csrf区别
1 xss,cors,csrf
2 xss:跨站脚本攻击
3 cors:跨域资源共享
4 csrf:跨站请求伪造
2 路飞后台配置
2.1 封装日志对象
1 django中使用日志
2 日志的配置,复制到配置文件中
# 真实项目上线后,日志文件打印级别不能过低,因为一次日志记录就是一次文件io操作
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, # 是否让日志信息继续冒泡给其他的日志处理系统
},
}
}
2 封装一个get_logger函数(utils/logger)
import logging
def get_logger(name):
my_logger = logging.getLogger(name)
return my_logger
3 使用
在使用位置导入,使用
from luffyapi.utils.logger import get_logger
logger=get_logger('django')
def test_logger(request):
logger.error('请求来了')
return HttpResponse('ok')
4 拓展:日记记录了以后是要有用的,分析
-自己写:es,mongodb
-ELK:日记收集分析工具
2.2 响应对象
# utils/response.py
from rest_framework.response import Response
class APIResponse(Response):
def __init__(self, code=100, msg='成功', data=None, status=None, headers=None,
exception=False, content_type=None, **kwargs):
real_data = {
'code': code,
'msg': msg,
'data': data
}
data.update(kwargs)
super().__init__(data=real_data, status=status, headers=headers,
exception=exception, content_type=content_type)
2.3 全局异常
# utils/exceptions
from rest_framework.views import exception_handler
from .response import APIResponse
from .logger import get_logger
logger = get_logger('django')
def custom_exception_handler(exc, context):
response = exception_handler(exc, context)
# print(exc)
# print(context)
if not response:
# 出了异常
res = APIResponse(code=999, msg='系统错误')
logger.error('服务端错误,错误原因是:%s,出错的view是:%s,请求地址是:%s'%(
str(exc),
str(context['view']),
context['request'].get_full_path()
)
)
return res
return response
# sentry:开源的使用django开发的无关平台的日志记录及分析的平台
3 前端首页
3.1 头部组件
<template>
<div>
<div class="slogan">
<p>老男孩IT教育 | 帮助有志向的年轻人通过努力学习获得体面的工作和生活</p>
</div>
<div class="nav">
<ul class="left-part">
<li class="logo">
<router-link to="/">
<img src="../assets/img/head-logo.svg" alt="">
</router-link>
</li>
<li class="ele">
<span @click="goPage('/free-course')" :class="{active: url_path === '/free-course'}">免费课</span>
</li>
<li class="ele">
<span @click="goPage('/actual-course')" :class="{active: url_path === '/actual-course'}">实战课</span>
</li>
<li class="ele">
<span @click="goPage('/light-course')" :class="{active: url_path === '/light-course'}">轻课</span>
</li>
</ul>
<div class="right-part">
<div>
<span>登录</span>
<span class="line">|</span>
<span>注册</span>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "Header"
}
</script>
<style scoped>
.header {
background-color: white;
box-shadow: 0 0 5px 0 #aaa;
}