A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一.项目配置(通过类添加配置)1.配置debug
2.配置数据库
3.创建数据库
4.加载配置
5.初始化数据库
6.配置redis(主机和端口)
7.初始化redis
8.开启当前项目的CSRF保护,只做服务器验证功能(CSRFProtect)
9.设置session的保存位置
    1)导包 flask_session  
    2)配置
        1>Session保存配置: SESSION_TYPE = "redis"
        2>开启session签名(开启之后需要设置secret_key): SESSION_USE_SIGNER =True
        3>设置session保存的redis: SESSION_REDIS = StrictRedis(host="",port="")
        4>设置session需要过期: SESSION_PERMANENT = False
        5>设置session过期时间: PERMANENT_SESSION_LIFETIME = 86400*2
        6>设置secret_key: SECRET_KEY = os.urandom(48)
    3)用Session配置来管理: Session(app)
10.命令行管理项目
11.集成数据库迁移命令
    1)将app与db关联
    2)将迁移名添加到manage里面

二.代码抽取1.抽取配置到配置文件
2.创建业务逻辑文件夹(info)
3.抽取初始化的操作到info文件夹下的__init__.py下(程序入口文件只保留启动程序需要的代码)
4.程序入口导入业务逻辑文件夹下的app和db
5.添加开发环境配置和生产环境配置(继承一个基类)有需要还可添加单元测试环境配置
6.使用字典记录配置类
7.把创建app的代码使用函数装起来(使可以只在manage里面加载不同的配置)
8.在manage.py里面调用函数创建app,类似于工厂方法
9,修改数据库初始化的方式,函数外面定义,函数内通过init_app()初始化
三.集成日志1.info下的__init__下添加配置日志的方法
2.在不同配置类中设置日志的不同等级
3.传入配置字典,设置日志的不同等级
4.在项目目录下创建存储日志的文件夹
5.测试打印日志  logging.debug("测试debug")...
6.设置忽略文件忽略日志文件夹下的文件
7.在日志文件夹下添加一个 .keepgit(git默认push不上空文件夹,这样保证了能把空文件夹push上去,这个文件名只是大家都这么写)
四.抽取蓝图目录1.info下面新建modules模块目录
2.modules下面新建index模块目录,存放主页的业务逻辑
3.index下__init__创建蓝图
4.创建views存放所有的视图函数
5.导入蓝图,装饰视图函数
6.__init__下导入视图函数
7.info下__init__注册蓝图到配置好的app
8.在注册的时候导入蓝图,不在最上面导入.什么时候第一次使用什么时候开始导入蓝图,一般第一次使用是注册的时候
五.设计数据库1.使用startUML设计数据库表之间的关系
2.通过分析设计需要多少张表,每个表有哪些字段
3.分析表与表之间有哪些关联关系
4.创建模型类(info下)
5.数据库迁移进行建表
6.导入测试数据(先导入一的一方再导入多的一方)
7.把migrations设置为不被git跟踪(在.gitignore中添加migrations)
8.info下创建constants.py,存放常用的常量
六.导入静态文件和创建模板文件1.把所有静态文件导入到创建app的同级目录下的static文件夹下
2.创建模板文件夹(templates)
3.把静态文件index.html拖到模板文件夹下的news文件夹下
4.注册根路由(加载模板文件)
5.加载网站图标(favicon.ico)显示在标题栏,浏览器会默认发起一个固定的请求:/favicon.ico 加载方式:current_app.send_static_file([在静态文件夹下的位置])///还可以使用重定向到静态资源


七.登录注册1.info下创建utils工具目录,把生产验证码的工具包导入进去.把错误状态码规范也放进去.
2.修改前端main.js代码,通过uuid生成一个图片验证码的编号,并设置页面中图片验证码img标签的src属性(发送请求时把图片验证码的编号也带过去)
3.新建登录注册业务逻辑模块.(passport)
4.注册蓝图
5.创建获取验证码视图函数
    1)取到url中?后面的参数:request.args.get("", None)
    2)判断参数是否有值,如果没有值,抛出错误:abort(403)
    3)导入生成验证码的工具类
    4)生成验证码
    5)保存图片验证码的内容到redis(记得tyr),发生异常往日志里面写error,抛出错误abort(500).过期时间调用常量里面的.
    6)返回图片验证码
        设置响应:response = make_response(image)
                response.headers["Content-Type"] = "image/jpg"
        返回:return response
6.为图片验证码下载工具集:pip install Pillow


[[[[  发送短信功能实现前的分析
1.发送短信验证码
    1)客户端post请求:请求参数(手机号,用户输入的图片验证码,图片的随机编号)
    2)服务端取到参数
    3)通过图片编号找到对应的准确验证码内容
    4)与用户的验证码内容进行对比
    5)内容一样则验证通过,生成随机的短信验证码数字,让第三方平台发送短信验证码(第三方短信验证码平台-->荣联云或者阿里云)
2.服务器给出发送短信的响应,表示是否发送成功
3.服务器告诉第三方平台要发送给哪个手机号,发送的验证码是什么.以及发送模板的ID
]]]]


7.注册第三方发送短信的平台登录进行接入
8.下载第三方开发者提供的SDK
9.info下创建libs包来存储第三方库,将容联云的SDK复制进去
10.集成工具类
11.修改工具类代码sms.py
    1)修改各种配置改成自己的
    2)CCP(发送短信辅助类)写成单例模式
12.设计接口
13.设计视图函数(/sms_code)
    1)获取浏览器发送过来的参数(手机号,图片验证码内容,图片验证码的随机编号)
    2)校验参数(是否有值,是否符合规则,不符合规则返回的是一个json数据)
    3)从redis取出真实的验证码内容
    4)与用户的验证码内容进行比较,如果不一致,那么返回验证码输入错误
    5)如果一致,生成短信验证码的内容(随机数据.日志记录一下)
    6)发送短信验证码(发送成功返回0)
    7)保存短信验证码内容到redis(key为'SMS'+mobile).调用常量设置的过期时间
    8)告知发送结果(return jsonify())
14.在main.js里面写发送验证码时的ajax请求(按照接口设计写)
15.设置redis的解码为True(在初始化redis时设置)
16.注册逻辑
    1)获取参数
    2)校验参数
    3)取到服务器保存的真实的短信验证码内容
    4)校验用户输入的短信验证的内容和真实验证码内容是否一致
    5)如果一致,初始化User模型,并且赋值属性(对密码进行加密处理)
    6)将user模型添加进数据库
    7)设置session保存用户的登录状态
    8)返回响应
    9)密码加密处理
17.添加前端处理的代码
18.修改main.js的bug(图片验证码和点击输入框)
19.实现登录后端逻辑(五步)
    1)获取参数
    2)校验参数
    3)验证密码
    4)保存登录状态(设置session)
    5)返回响应
20.实现登录前端逻辑
21.实现首页显示登录注册切换的逻辑
    1)用户已经登录,将当前用户数据传到模板进行显示(通过字典传入)
    2)修改index模板文件
22.实现退出的逻辑(删除session)
23.实现退出前端页面的实现
    1)为退出添加点击事件
    2)js中创建logout函数
    3)刷新当前

八.关于数据库的自动提交1.注册和登录都记录一下用户的最后登录时间
2.配置数据库自动提交(SQLAlchemy的teardown实现commit)
    缺点:
    1)没有rollback.自己提交时能使用
    2)在请求后才进行提交
九.CSRF配置1. 开启csrf保护:CSRFProtect(app)
2. 使用请求钩子,在每次返回响应之前设置csrf_token的cookie
3.在ajax里面添加请求头:headers{
    "X-CSRFToken":getCookie('csrf_token')
}
4.getCookie网上代码随便找一个(获取浏览器的cookie)
十.主页1.index视图函数下写右侧新闻排行的逻辑
2.查询数据库中点击量在前6的数据
3.定义一个字典列表存储六条字典数据
4.把字典列表传入主页模板文件
5.主页模板中循环渲染出数据
6.添加共用的自定义工具类(common.py)
7.为模板中排行的前三添加过滤器渲染样式
8.在创建app的__init__注册蓝图之前添加自定义过滤器
9.实现新闻列表数据的显示
    1)获取参数
    2)校验参数
        1>判断查询的是否为最新分类
        2>添加条件到查询条件列表
    3)分页查询数据
10.将查询出来的模型对象列表转为字典列表
11.字典保存所有的数据(总页数,当前页数,字典列表)
12.返回一个json数据,把字典保存的数据传过去
13.在index.js中通过ajax的get方式接收数据
14.实现滚动刷新数据前端页面
15.在主页里面实现分类查看的业务逻辑
16.新建news(新闻详情)模块,初始化蓝图,注册路由,注册蓝图
17.创建视图函数
18.渲染模板
19.首页和新闻详情页基类模板抽取(继承)
20.视图函数中返回新闻详情需要的数据
十一.抽取用户信息
1.共用工具类中添加一个获取用户信息的装饰器函数,里面把用户信息赋值给一个g变量
2.在需要用到用户信息的视图函数上添加装饰器
3.在视图函数中需要用到用户的地方使用g变量
4.在同一个模块中的视图函数上使用同一个装饰器时需要在装饰器函数下加上 @functools.wraps(f)

十二.新闻详情页0.实现新闻详情页右侧的排行
    1)按照新闻点击量查询出前10条数据放入列表
    2)传入一个字典列表
    3)返回给模板渲染
1.news模块下查询新闻数据
    1)通过传过来的news_id查询数据库中的新闻数据
    2)如果新闻没找到,抛出404异常
    3)找到了,更新新闻的点击次数
    4)把新闻模型对象转换为字典数据传输给模板渲染(记得为新闻内容显示添加过滤器safe)
2.实现前端页面的评论显示
    1)前端模板判断是否登录
    2)登录后,则加载发布评论框
    3)没有登录,则显示点击登录发表评论的提示
3.更改Log的链接到首页
4.实现是否收藏
    1)如果用户已登录,新闻存在,判断用户是否收藏该新闻
    2)如果未收藏,显示收藏按钮,如果已收藏,显示取消收藏按钮
5.收藏和取消收藏后端逻辑实现
    1)新闻详情下根据接口文档实现视图函数的业务逻辑
    2)接收参数
    3)判断参数
    4)查询新闻并判断新闻是否存在
    5)收藏新闻
        1>如果当前新闻不在用户的新闻收藏列表里面
        2>添加新闻到用户的新闻收藏列表
        3>在最开始之前判断用户是否登录
    6)接收action参数
    7)判断参数action是否在指定的动作里面
    8)如果action等于cancel_colect,取消收藏
    9)否则,收藏新闻
6.前端实现收藏和取消收藏
    1)新闻详情js里面收藏发送ajax请求
    2)设置参数
    3)收藏成功隐藏收藏按钮,显示取消收藏按钮
    4)如果用户未登录,弹出用户登录界面
    5)按照相反的方式是实现取消收藏的ajax请求.改变一下参数和判断条件
   
7.添加评论(后端逻辑)
    1)添加新闻评论的视图函数
    2)获取参数.先判断用户是否登录
    3)获取新闻id,评论,父评论id
    4)校验参数(父评论可以为空)
    5)id转为int型(如果有父评论,父评论id也需要转Int)
    6)查询新闻判断新闻是否存在
    7)初始化评论模型,并且赋值(四条数据:用户id,新闻id,评论内容,如果有父评论,父评论id)
    8)添加到数据库并提交
    9)返回成功,以及评论的所有内容
8.添加评论(前端实现)
    1)ajax请求
    2)发送参数(新闻id和新闻内容)
    3)拼接接收到的内容添加到标签里面的前面
    4)清空输入框
   
9.新闻详情页查询评论数据
    1)查询新闻的所有评论按照时间排序
    2)模型数据转为字典数据
    3)返回到前端模板
    4)for循坏填充模板
10.回复评论前端实现
11.评论总数加一
    1)detail.js中添加更新评论总数的函数
    2)统计评论节点的个数
    3)写入模板页面
   
12.评论点赞后端逻辑
    1)新建评论点赞视图函数
    2)判断用户是否登录
    3)获取参数(评论id,新闻id,点赞/取消点赞action)
    4)校验参数
    5)是否有参数为空
    6)点赞操作是否存在
    7)id转为int型
    8)通过评论id查询出要点赞的评论
    9)判断是否查询出数据
    10)点赞评论
        1>找到要点赞的评论(复合主键,需要两个条件)
        2>如果没有点赞,初始化评论点赞模型
        3>赋值数据(谁点赞,点赞哪条评论)
        4>加入数据库
        5>点赞数加一
    11)取消点赞
        1>找到要取消点赞的评论(复合主键,需要两个条件)
        2>如果数据存在,删除
        3>点赞数减一
    12)提交(异常捕获)
    13)返回操作成功结果
13.评论点赞前端js实现
14.评论点赞前端模板显示
15.是否点赞的后端逻辑实现
    1)查询出当前新闻的所有评论id(comment)列表
    2)如果新闻评论id列表存在,查询出当前评论被当前用户点赞的所有评论
    3)取出所有被点赞的评论的id
    4)如果新闻评论存在,在评论中表添加是否点赞属性,默认都设为false
    5)遍历所有点赞的评论id,如果当前评论的id在里面,则把该条评论的点赞属性设为True
    6)把评论信息返回到模板渲染
16.前端在标签中进行循坏判断,点赞为True的加上已点赞属性
17.显示点赞条数前端实现
18.解决点赞的BUG
十三.个人中心1.继承模板
2.创建用户模块
3.注册蓝图
4.创建用户信息视图函数
5.加载用户信息模板
6.判断用户是否登录
7.修改前端框架代码BUG,拖到模板文件夹下
8.增加视图函数加载前端框架模板文件
9.在视图函数中传入用户数据给基本资料前端框架模板(直接g变量传过去)
10.在模板中显示用户的默认信息
10.为用户基本信息视图函数添加请求方式get和post
    1)如果是get请求,返回模板以及用户数据
    2)如果是post请求,修改用户的数据
11.修改用户基本数据后端逻辑
    1)获取参数(nick_name,signature,gender)
    2)校验参数(判断参数是否有值,性别是不是男或者女)
    3)获取用户(g.user)
    4)修改数据(直接赋值)
    5)返回修改成功的响应
12.修改用户基本数据前端实现
    1)修改user_base_info.js路径
    2)添加修改用户信息ajax的实现
    3)如果请求成功,修改父窗口的内容
    4)修改模板数据,进行渲染
   
13.修改头像后端逻辑pic
    1)添加函数(post,get)
    2)get请求返回模板文件,显示头像.把用户信息传过去
    3)修改静态模板
    4)注册七牛云
    5)安装pip install qiniu
    6)工具包下创建图片仓库py文件
    7)按照官方文档改写SDK
    8)如果是POST请求,获取参数
    9)取到上传的图片request.files.get().read()
    10)使用上传头像工具上传头像,取到key
    11)保存头像地址到数据库
    12)返回响应(把头像地址传过去)
14.修改头像前端逻辑实现

15.密码修改后端逻辑(get,post)
    1)get请求返回模板
    2)post请求,获取参数
    3)校验参数
    4)判断旧密码是否正确
    5)设置新密码
    6)返回响应
16.密码修改前端实现

17.我的收藏后端逻辑(get)
    1)创建视图函数,测试返回模板文件
    2)获取参数(当前页数)
    3)校验参数(不是int抛出异常,设置默认为1)
    4)设置当前默认为第一页,总页数为一页(当没有查询出数据时传过去的就是默认的)
    5)查询用户指定页数的收藏的新闻(按照新闻的创建时间降序排序)
    6)取出当前页的页码,总页数,当前页新闻数据列表
    7)获取所有数据存放到字典
    8)返回数据到前端模板
18.我的收藏前端模板实现

19.新闻发布后端逻辑(get,post)
    1)加载模板
    2)新建视图函数,返回模板
    3)查询所有新闻分类数据(移除最新的分类)
    4)返回数据到模板
    5)渲染模板
    6)post请求,获取数据
    7)校验数据
    8)取到索引图片.将图片上传到七牛云
    9)读取一下图片看是否能读到,然后上传到七牛云(try一下)
    10)初始化新闻模型
    11)按照数据库的字段赋值内容(审核状态也需赋值)
    12)添加到数据库,提交
    13)返回请求成功
20.新闻发布前端实现,发布尘成功后跳转到个人发布的新闻列表(ajaxSubmit)

21.个人中心新闻列表
    1)新建新闻列表视图函数
    2)获取url传过来的第几页,默认第一页
    3)默认设置当前页为第一页,总页数为一页(当没有查询出数据时传过去的就是默认的)
    4)分页查询出当前新闻的作者id等于当前用户id的所有新闻
    5)传入字典列表
    6)返回到模板进行渲染
22.个人中心新闻列表前端实现
23.修改主页查询新闻过滤的条件,新闻的审核状态等于0(审核通过)
十四.404错误页面处理1.加载404模板文件
2.继承基类模板
3.info的__init__下添加异常捕获的视图函数
4.传入用户是否登录的信息
5.返回给模板,修改模板
十五.管理员1.在manage.py里面添加创建管理员的函数
2.校验参数
3.初始化用户模型
4.赋值,管理员属性为True
5.提交到数据库
6.为函数添加装饰器
    1)@manage.option('-n','--name',dest="name")
    2)@manage.option('-p','--password',dest="password")
7.在命令行运行:python manage.py createsuperuser -n admin -p 123456

8.添加admin模块
9.创建并注册蓝图
10.创建登录视图函数(get,post)
    get请求:返回模板
    post请求:
    1)获取参数
    2)校验参数,并返回结果给前端模板
    3)查询当前用户(用户名是否正确,并且是否为管理员),返回错误信息
    4)判断用户是否存在,返回错误信息
    5)校验密码,返回错误信息
    6)保存登录信息到session(id,mobile,nick_name,is_admin)
    7)重定向到管理员后台主页(admin.index)
    8)设置csrf_token()
    9)判断当前是否有登录,如果有登录,重定向到管理员后台主页(get请求时)

11.在admin模块里面添加请求钩子,每次请求之前进行判断是不是管理员,如果不是管理员,直接跳转到首页
12.退出登录里面增加删除管理员的session操作
十六.后台管理1.更新后台用户信息,加载名称
2.用户统计
    1)添加测试用户信息
    2)加载模板
    3)添加用户统计视图函数
    4)传输数据(默认全为0)到模板,修改模板
    5)查询数据
        1>总人数,除了管理员
        2>月新增数,除了管理员,创建时间大于当月1号0点0分
        3>日新增数,除了管理员,创建时间大于当月当天0点0分
    6)封装数据
    7)返回数据
    8)用户登录活跃数
        1>创建列表(活跃时间,活跃总数)
        2>查询今天活跃的用户数据
        
3.用户列表
    1)创建视图函数
    2)加载模板
    3)获取参数(页数,默认为1)
    4)校验参数(出错默认赋值1)
    5)默认数据为空,页数和当前页为1
    6)分页查询数据库(除了管理员)
    7)遍历数据
    8)封装数据
    9)返回数据
    10)前端渲染数据
4.新闻审核
    1)创建新闻审核视图函数(get)
    2)加载模板
    3)获取参数
    4)校验参数(失败赋值1)
    5)设定默认值
    6)分页查询数据
    7)遍历数据
    8)封装数据
    9)返回数据
    10)模板渲染
5.新闻审核列表中的搜索
    1)新闻审核视图中获取参数(keywords,默认为none)
    2)添加过滤条件(新闻的标题存在关键字)到条件列表
    3)把查询到的数据返回到模板
    4)模板进行渲染
6.新闻审核
    1)创建视图函数(新闻审核处理,带参数:新闻id)
    2)加载模板
    3)通过新闻id查找新闻
    4)没查到返回错误信息
    5)查到了就返回新闻信息
    6)创建视图函数(新闻审核是否通过)
    7)接收参数(新闻id,是否通过("accept","reject"))
    8)校验参数
    9)查询新闻
    10)判断新闻是否存在
    11)通过,设置新闻状态
    12)不通过,接收拒绝原因
    13)没有拒绝原因,返回错误信息:输入拒绝原因
    14)保存状态和拒绝原因
    15)返回成功
    16)修改前端js和模板

7.新闻版式编辑页面
    1)加载模板
    2)新建视图函数(和新闻审核一样)
    3)修改前端模板,渲染数据
8.新闻版式编辑处理
    1)创建视图函数(get.post)
    2)加载模板
    3)获取参数
    4)校验参数(参数不存在404)
    5)参数转整型(失败,返回参数错误)
    6)查询数据库(失败,返回失败原因)
    7)判断数据是否存在,不存在返回失败原因
    8)查询所有分类数据(除了最新的)
    9)转换数据,放入字典列表
    10)封装数据
    11)数据返回给前端
    12)修改前端代码渲染数据
    13)如果是post请求:
        1>获取参数
        2>校验参数是否有值(有些值可以为空)
        3>查询指定id的新闻
        4>判断新闻是否存在
        5>如果图片存在,读取图片,上传到七牛云,对数据库图片重新赋值
        6>设置其他的一些数据
        7>返回OK
        8>实现前端js

9.新闻分类管理(get)
    1)新建视图函数(新闻分类)
    2)加载模板,修改模板
    3)查询分类数据
    4)取到分类字典
    5)移除最新分类
    6)返回数据到模板进行渲染
10.编辑和增加分类(post)
    1)在原有的视图函数上写
    2)获取参数(分类名字,分类id)
    3)校验参数(分类名字不存在参数错误)
    4)判断是否有cid&分类默认为空
    5)强转id
    6)查询分类
    7)判断是否查询到分类
    8)修改分类名字
    9)如果没有id,初始化类,增加分类名字,增加到数据库
    10)返回OK
    11)渲染前端模板
十六.关注1.修改新闻详情页的前端模板,新闻有作者显示作者,没有作者则不显示
2.新闻详情主页视图函数下判断当前新闻有作者的情况
    1)默认为没有关注
    2)如果新闻有作者,并且用户登录了,新闻的作者在用户的关注列表中,关注变为True
3.关注和取消关注
    1)新闻详情模块下创建关注用户视图函数
    2)取到用户登录的信息,如果未登录,返回未登录
    3)获取参数(user_id,action),json方式
    4)校验参数(是否为空,是否在关注或者取消关注里面.强转user_id)
    5)根据接收到的用户id查询要关注或者取消关注的用户信息
    6)如果没有这个用户返回错误信息
    7)如果是关注操作
        1>如果其他用户不在当前用户关注中,为当前用户列表添加当前用户
        2>否则返回已经关注过
    8)否则是取消关注
        1>如果其他用户在用户的关注列表中,在用户的关注列表中移除当前用户
        2>否则返回没有关注当前用户的信息
    9)返回操作成功
    10)添加判断,如果用户和其他用户的id相等,说明是自己,返回自己不能关注自己
4.前端添加新闻详情js中添加关注和取消关注的代码

5.个人中心-我的关注
    1)加载模板
    2)个人中心下新建视图函数(user_follow)
    3)获取参数(页数,当前登录的用户)
    4)校验参数(页数转整型)
    5)设置默认数据,页数,当前页
    6)分页查询数据
    7)转换数据
    8)封装数据
    9)返回数据
    10)渲染前端模板
        1>修改card_list样式height:160px
    11)取消关注:调用新闻详情下取消关注的接口

6.其他用户信息
    1)加载模板
    2)个人中心新建视图函数(other_info)
    3)抽取模板
        1>在基类里面抽取一个CSS模板,用来放分页插件的css(因为样式后面的能覆盖前面的)
        2>加入两个js在子模板里面(注意顺序)
    4)获取参数(其他人的id)
    5)校验参数(出错abort(404))
    6)用户列表中查询用户信息
    7)如果用户没有值,abort(404)
    8)封装数据,返回模板以及数据
    9)修改前端模板
    10)视图函数中添加判断是否关注,返回结果
7.其他用户发布的新闻的展示(ajax的get请求)
    1)个人中心新建视图函数(other_news_list)
    2)获取参数(用户的id,页数默认为1)
    3)校验参数(是否为空,强转)
    4)查询其他用户的信息
    5)判断用户是否存在
    6)分页查询,其他用户的新闻列表
    7)获取当前页数据,页数,总页数
    8)遍历数据
    9)封装数据
    10)返回数据
    11)前端渲染
十七.项目部署1.注册&购买云服务器(阿里云,百度云...)
2.设置镜像,开启服务器
3.设置匹配规则
4.连接云服务器
    1).通过公网ip链接服务器(ssh root@公网ip)
    2).通过密钥连接服务器:
        1>链接过了需要去~/.ssh下清空know_hosts的内容,它记录了已经链接了
        2>ssh-keygen 生成新的公钥和私钥
        3>服务器中的authorized_keys中存公钥,链接时使用私钥链接
        4>复制私钥到一个 文件名.pem 文件
        5>使用私钥去连接服务器(ssh 文件名)
5.安装nginx
6.安装gunicorn服务器
7.配置Nginx
8.启动Nginx
9.使用gunicorn运行程序实例(测试能否使用)
10.运行项目(git pull 项目)
    1)建数据库
    2)数据库迁移
    3)增加存放所有扩展包的文件(pip freeze > requirements.txt),push到git
    4)执行git pull把requirements.txt下载进目录, pip install -r requirements.txt
    5)使用gunicorn运行项目

11.运行两个服务器:
    1)赋值一份项目
    2)修改Nginx配置
    3)重启Nginx
    4)使用gunicorn以不同的端口分别运行两个项目

   


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马