文武的客 - 后端
type: channel
link: http://binscor.top/index.php/category/%E5%90%8E%E7%AB%AF/
items: 第9节、日志
items: 第8节、celerys及中间件
items: 第7节、站点、分页、文件上传及富文本编辑器
items: 第6节、系统User及静态资源
items: 第5节、缓存-发送邮件
items: 第4节、model
items: 第3节、模板
items: 第2节、视图
items: 第1节、安装配置
items: 第9节、flask部署（虚拟机环境）

第9节、日志
type: item
date: 2019-10-07T17:32:00+08:00
description: 一、Log简介logging模块是Python内置的标准模块，主要用于输出运行日志，可以设置输出日志的等级、日志保存路径、日志文件回滚等；相比print，具备如下优点：通过log的分析，可以方便用户了解系统或软件、应用的运行情况；如果你的应用log足够丰富，也可以分析以往用户的操作行为、类型喜好、地域分布或其他更多信息；[...]

第8节、celerys及中间件
type: item
date: 2019-10-07T17:15:00+08:00
description: 一、celerys作用：用户发起请求 request的时候 需要等待response 但是在视图函数中 有些功能执行需要时间 可能出现用户需要等待很久才会返回响应 导致用户的体验很差 还会容易出现代码中的异常网站想要隔断时间同步一次数据 但是http需要出发才能执行(1) celery任务 task本质就是一个python函数队列 queue将要执行的任务存放在对列中工人 worker负责执行队列中的任务broker负责调度 redis的缓存(2) 解决的问题可以将耗时的代码放在celery中执行celery定时执行(3) 安装pip3 install celerypip3 install celery-with-redispip3 install django-celerypip3 install redis-server(4)在settings.py文件中的install_apps添加 djceleryINSTALLED_APPS = [ ... 'App', 'djcelery', ]在底部添加如下代码#djcelery import djcelery djcelery.setup_loader() #初始化 BROKER_URL = 'redis://127.0.0.1:6379/0' #链接redis 选择数据库0 #BROKER_URL = 'redis://:密码@127.0.0.1:6379/0' CELERY_IMPORTS = ('App.task') #导入任务py文件 App是应用名称 task是任务文件名称(5) 创建task任务文件 在App下App/task.pyfrom celery import task import time #要执行的任务 @task def test(): print('today is a good day1') time.sleep(5) print('today is a good day2')(6) 执行迁移python3 manage.py migrate(7) 在project下创建celery.py文件from __future__ import absolute_import import os from celery import Celery from django.conf import settings os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'whthas_home.settings') app = Celery('portal') app.config_from_object('django.conf:settings') app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) @app.task(bind=True) def debug_task(self): print('Request: {0!r}'.format(self.request))(8) 在project/init.py文件添加如下代码from .celery import app as celery_app(9) 在视图函数中 调用费时的任务from App.task import test def index(req): test.delay() #把活添加到队列 不会阻塞 return HttpResponse('首页')(10) 启动redisredis-serverredis-cli(11) 启动服务python3 manage.py runserver(12) 启动worker在打开一个终端cd /django的工作目录python3 manage.py celery worker --loglevel=info(13)定时执行在settings.py文件中添加如下代码定时执行一个任务from datetime import timedelta CELERYBEAT_SCHEDULE = { 'schedule-test1':{ 'task':'App.task.test', #定时执行的任务 'schedule':timedelta(seconds=7), #执行间隔 } }定时执行多个任务 from datetime import timedelta CELERYBEAT_SCHEDULE = { 'schedule-test1':{ 'task':'App.task.test', 'schedule':timedelta(seconds=7), }, 'schedule-test2':{ 'task':'App.task.test2', 'sch…

第7节、站点、分页、文件上传及富文本编辑器
type: item
date: 2019-10-07T17:07:00+08:00
description: 一、站点管理(1) 创建模型Grade和Students在models.py中实例class Grade(models.Model): gname = models.CharField(max_length=20) ggirlnum = models.IntegerField(default=30) gboynum = models.IntegerField(default=40) isDelete = models.BooleanField(default=False) createTime = models.DateTimeField(auto_now_add=True) def __str__(self): return self.gname class Meta: db_table = 'grade' class Students(models.Model): sname = models.CharField(max_length=10,default='xxx') ssex = models.BooleanField(default=True) sage = models.IntegerField(default=20) sinfo = models.CharField(max_length=100,default='个人简介') isDelete = models.BooleanField(default=False) sgrade = models.ForeignKey(Grade) def __str__(self): return self.sname class Meta: db_table = 'students'执行迁移python3 manage.py makemigrtionspython3 manage.py migrate(2) 配置admin应用（默认是添加好的）INSTALLED_APPS = [ 'django.contrib.admin', ](3) 创建管理员用户命令python3 manage.py createsuperuser提示为：依次输入 用户名->邮箱->密码->确认密码(4) 执行汉化在settings.py文件中修改如下代码LANGUAGE_CODE = 'zh-Hans' TIME_ZONE = 'Asia/Shanghai'(5) 访问127.0.0.1:8000/admin/(6) 在admin.py文件下添加要展示使用的模型类进行注册展示from django.contrib import admin from .models import Grade,Students # Register your models here. #注册模型类 在admin站点进行展示 admin.site.register(Grade) admin.site.register(Students)(7) Grade进行字段的展示添加等修改#创建一个后台字段展示的类 class GradeAdmin(admin.ModelAdmin): #字段显示属性 list_display = ['pk','gname','ggirlnum','gboynum','isDelete'] #过滤字段 list_filter = ['gname'] #搜索字段 search_fields = ['gname'] #分页 list_per_page = 5 #改变字段的顺序 添加 修改 # fields = ['gname','ggirlnum','gboynum','isDelete'] # 字段分组 添加 修改 fieldsets = [ ('num',{"fields":['ggirlnum','gboynum']}), ('base',{"fields":['gname','isDelete']}), ] admin.site.register(Grade,GradeAdmin)注意：fields 和 fieldsets不能同时存在(8) Students进行字段的展示添加等修改实例class StudentsAdmin(admin.ModelAdmin): # 搜索字段 search_fields = ['sname'] # 分页 list_per_page = 5 def mySex(self): if self.ssex: return '男' else: return '女' mySex.short_description = "性别" #并显示性别的男女 # list_display = ['pk','sname','ssex','sage','sgrade','isDelete']…

第6节、系统User及静态资源
type: item
date: 2019-09-23T18:02:00+08:00
description: 一、系统User模型类导入：views.pyfrom django.contrib.auth.models import User(1) 用户的创建from django.contrib.auth.models import User u= User.objects.create_user(req.POST.get('username'),req.POST.get('email'),req.POST.get('userpass'))对象的保存u.save()(2) 用户认证导入：from django.contrib.auth import authenticate传入关键字参数进行用户的认证u = authenticate(username=req.POST.get('username'),password=req.POST.get('userpass'))认证结果认证成功返回对象认证失败返回None(3) 维持用户登录状态导入：from django.contrib.auth import login实例u = authenticate(username=req.POST.get('username'),password=req.POST.get('userpass')) if u:#验证通过 if u.is_active: #并且账户激活 login(req,u) #处理登录 状态保持 使用的依然是session return redirect(reverse('App:index')) return HttpResponse('authenticate用户认证')(4) 在模板和视图函数中判断登录状态和获取登录者数据index.html{% if request.user.is_authenticated %} #登录则为True 否则为False 欢迎:{{ request.user.username }} | 退出登录 {% endif %}views.pydef test(req): # print(req.user.email) if req.user.is_authenticated: print(req.user.email) #如果登录则取出登录者的邮箱信息 else: print('你没有登录') #输出没登录 return HttpResponse('测试request.user属性')(5) 登录的限制 login_required限制某些路由必须登录才能访问导入：from django.contrib.auth.decorators import login_required实例：@login_required(login_url='/login/') def test(req): return HttpResponse('当前路由必须登录才能进行访问')(6) 如果是从login_required重定向到登录模板 则登录成功后在跳转回去 否则去首页实例：def Login(req): if req.method == 'GET': req.session['next'] = req.GET.get('next','/') #/test/ / return render(req,'djangouser/login.html') if req.method == 'POST': ... return redirect(req.session.get('next'))(7) 修改密码from django.contrib.auth.hashers import make_password #修改密码 def update_password(req): u = authenticate(username='zhangsan', password='123456') # print(u) if u: if u.is_active: u.password = make_password('123456') u.save() return HttpResponse('修改成功')二、自定义用户模型给user模型添加phone和icon字段models.pyfrom django.db import models from django.contrib.auth.models import AbstractUser # Create your models here. class User(AbstractUser): phone = models.CharField(max_length=11,default='15611833906') icon = models.CharField(max_length=…

第5节、缓存-发送邮件
type: item
date: 2019-09-20T11:25:00+08:00
description: 一、配置缓存settings.py#添加缓存的配置 CACHES = { 'default':{ #缓存的位置 'BACKEND':'django.core.cache.backends.db.DatabaseCache', 'LOCATION':'my_cache_table',#缓存的表 } }创建缓存表python3 manage.py createcachetable my_cache_table库中就会出现my_cache_table表实例：from django.shortcuts import render from django.views.decorators.cache import cache_page from App.models import User #展示所有用户数据的方法 @cache_page(60) def showUser(req): print('----能看到我几次？------') u = User.objects.all() return render(req,'showUser.html',{'data':u})二、手动添加缓存cache.set 设置缓存keyvaluetimeoutcache.get(key) 获取缓存cache.get_many() 获取多条缓存cache.set_many() 设置多条缓存cache.delete() 删除缓存cache.clear 清空缓存实例from django.core.cache import cache def showUser(req): html = cache.get('showUser') if html: return HttpResponse(html) else: print('----能看到我几次？------') u = User.objects.all() tem = loader.get_template('showUser.html') html = tem.render({'data': u}) cache.set('showUser',html,60) return HttpResponse(html)三、使用redis进行缓存安装：sudo pip3 install django-redis配置settings.py#添加缓存的配置 CACHES = { 'default':{ #reids进行缓存 'BACKEND':'django_redis.cache.RedisCache', 'LOCATION':'redis://127.0.0.1:6379/1',#设置缓存的数据库 } }其它位置的代码不需要改变 重新访问路由地址即可四、发送邮件注意：发送邮件报错：Mail from must equal authorized user，则需要设置临时环境变量 windows：set MAIL_USER=用作发送邮件的邮箱账号linux：export MAIL_USER=用作发送邮件的邮箱账号(1) 发送单封邮件settings.py配置#发送邮件配置 EMAIL_HOST = os.environ.get('MAIL_SERVER','smtp.1000phone.com') EMAIL_HOST_USER = os.environ.get('MAIL_USER','xialigang@1000phone.com') EMAIL_HOST_PASSWORD = os.environ.get('MAIL_PASSWORD','123456')view.pyfrom django.shortcuts import render,HttpResponse from django.core.mail import send_mail import os def sendMail(req): send_mail( 'Subject here', 'Here is the message.', os.environ.get('MAIL_USER'), ['793390457@qq.com'], fail_silently=False, ) return HttpResponse('发送邮件')(2) 发送多封邮件def sendManyPeople(req): message1 = ('Subject here', 'Here is the message', os.environ.get('MAIL_USER'), ['948807313@qq.com']) message2 = ('Another Subject', 'Here is another message', os.environ.get('MA…

第4节、model
type: item
date: 2019-09-04T08:18:00+08:00
description: 一、配置数据库settings.py数据库默认为sqlite数据库 更改成mysql数库实例:settings.py 77行DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'djangopython1807', 'USER':'root', 'PASSWORD':'123456', 'HOST':'127.0.0.1', 'PORT':3306, } }helloworld/init.py文件import pymysql pymysql.install_as_MySQLdb()二、ORM概述：对象->关系->映射任务：根据对象的类型生成表结构将对象、列表的操作 转换为sql语句sql语句查询到的结果转换为对象和列表优点：极大的减轻了开发人员的工作量，不会因为数据库的改变而修改代码三、模型的字段和可选条件(1) 字段类型字段名称字段说明参数AutoField一个根据实际ID自动增长的Integer field 通常不指定(自动创建主键id字段) CharFieldvarchar类型字段max_length存储值的最大长度TextFieldlongtext类型 长文本 IntegerFieldint 类型字段 存储整形 DecimailField存储浮点形 更加精准（存钱）max_digits=None 位数长度,decimal_places=None 小数的位数FloatField浮点类型 BooleanField存储Bool值 True/False NullBolleanField存储 null/True/False DateFielddate字段auto_now = False 如果对数据进行修改则会自动保存修改的时间 auto_now_add=False 会自动添加第一次保存的时间 俩个参数不能同时设置TimeFieldtime字段参数同上DateTimeFielddatetimefield参数同上(2) 字段选项可选参数参数说明null如果设置为True 则当前字段值可以为nullblank如果设置为True 则当前字段可以为空（什么值都没有）db_column设置字段名称 不设置 字段名称默认为属性名db_index常规索引unique唯一索引primary_key主键索引default默认值四、定义模型(1) 模型、属性、表之间的关联一个模型类 对应数据库中的一张表 一个类属性 对应 表中的一个字段(2) 创建我们测试的模型models.pyfrom django.db import models # Create your models here. class Test(models.Model): char = models.CharField(max_length=20,default='char的默认值',db_index=True) text = models.TextField(null=True) intger = models.IntegerField(blank=True,db_column='inte') deci = models.DecimalField(max_digits=5,decimal_places=2) float = models.FloatField() bool = models.BooleanField() null = models.NullBooleanField() date = models.DateField(auto_now=True) time = models.TimeField(auto_now=True) dateTime = models.DateTimeField(auto_now_add=True)(3) 元选项在模型类中定义一个Meta类class Test(models.Model): ... class Meta: db_table = '表名称' #表名默认为 应用名称_类名的小写（App_test）注意：如果是表已经创建完成 在次更改表名 需要重新生成迁移文件 执行迁移文件原生sql改表名: alter table a rename b;(4) 创建表生成迁移文件python3 manage.py makemigrations执行迁移文件python3 manage.py migrate五、测试数据库(1) 进入到python shell进行测试python3 manage.py shell(2) 导包from App.models import Test(3) 添加数据t = Test() t.char = 'char' t.text = …

第3节、模板
type: item
date: 2019-09-03T17:47:00+08:00
description: 一、概述模板由俩部分组成：html代码逻辑控制代码作用：快速生成html页面优点：视图和模板可以理解为 M:N的关系 模板可以被任意视图调用 视图调用任意模板模板实现了业务逻辑和内容显示的分离二、模板的渲染(1) renderrender(request,tem_name,context=None)请求对象模板名称渲染的内容实例：url(r'^$',main.index,name='index'), def index(request): return render(request,'index.html',{'title':"首页"})(2) loader 渲染模板导入from django.template import loader实例:from django.template import loader def index(request): tem = loader.get_template('index.html') #拿到模板对象 result = tem.render({'title':"首页"}) #渲染模板 print(result) return HttpResponse(result) #响应模板三、模板中变量格式： { { 变量名称 } }就是视图像模板传递的数据注意：如果模板渲染的变量不存在 则插入空白字符模板中使用语法：可以在模板中调用方法/调用属性字典查询（不建议）数字索引四、 模板中标签格式： {% 标签名称 %}作用：在输出中创建文本控制逻辑和循环(1) if/elif/else/endif 标签可用的运算符> < >= <= == ! and or not in not in语法格式：{% if condition %} ... {% endif %}实例：{% if grade > 80 %} print({ { grade } }大于 80) {% elif grade >= 70 %} print({ { grade } }大于等于 70) {% else %} print({ { grade } }<70) {% endif %}(2) for标签A 语法格式：{% for xxx in xxx %} ... {% endfor %}实例：{% for i in lista %} { { i } } {% empty %} 当list变量不存在 则执行empty {% endfor %}B 迭代字典：{'dict':{'name':"张三",'age':18} } {#{% for key in dict %}#} #迭代拿到的是key {% for key,value in dict.items %} #拿到key和value { { key } }------{ { value } } {% endfor %}C 获取for迭代的状态变量描述forloop.counter迭代的索引从1开始forloop.counter0迭代的索引从0开始forloop.revcounter迭代的索引从最大长度递减到1forloop.revcounter0迭代的索引从最大长度递减到0forloop.first是否为第一次迭代forloop.last是否为最后一次迭代forloop.parentloop获取迭代嵌套的上一曾迭代的对象实例 {% for i in list %} {% for i in list %} { { forloop.counter } }---{ { forloop.counter0 } }---{ { forloop.revcounter } }----{ { forloop.revcounter0 } }----{ { forloop.first } }----{ { forloop.last } }---{ { forloop.parentloop.counter } } {% endfor %} {% endfor %} 注意：模板中的迭代不能使用range() 不支持for不支持和else搭配 而是和empty搭配 功能和esel一样 当迭代的变量不存在 则执行empty(3) 注释单行注释 {# 内容 #}多行注释{% comment %}​ ...{% endcomment %}(4) ifequal 标签说明: 判断俩个值是否相等 相等则为True实例{% ifequal 1 1 %} print(1==1) {% else %} print(1!=1) {% endifequal %}(5) ifnotequal 标签说明: 判断俩个值是否不相等 不相等则为True{% ifnotequal 1 1 %} print(1==1) {% else %} pr…

第2节、视图
type: item
date: 2019-08-29T17:58:00+08:00
description: 一、视图的概念(1) 视图的作用接收用户的请求 并响应给用户(2) 视图函数的本质python的函数(3) 视图的响应网页重定向错误模板404 NOT_FOUND500 SERVER_ERROR400 BAD_REQUESTjson 数据二、url配置路由：处理url地址与视图函数之间的程序 称之为路由(1) 配置制定根级的url（django帮你配置好的）ROOT_URLCONF = 'helloworld.urls'(2) urlpatterns 列表装有所有路由地址的列表url 参数：regexp 正则view 视图函数名name 给当前的url起名字 （url的反向解析）url中正则的参数的使用：r 必须 转义特殊字符^ 必须 必须完全匹配$ 必须 必须完全匹配注意: 也就是正则路由存在 ^和$就是和url请求的地址完全匹配 而不是 包含关系(3) 不带参数的urlurlpattern = [ url(r'^test/$', views.test), ] views.py def test(req): return HttpResponse('test')(4) 带一个参数的urlurlpattern = [ url(r'^arg/(\d{2})/$', views.test), #参数2个数值 ] views.py def arg(req,arg1): return HttpResponse(arg1)请求地址为 :http://127.0.0.1:8000/arg/11/注意：路由地址想要带参数 则必须添加() 作为值的存储(5) 带多个参数的urlurlpattern = [ url(r'^args/(\w{2})/(\w{2})/$',views.args) #带多个参数的路由地址 url(r'^args/(\w{2})_(\w{2})/$',views.args), #带多个参数的路由地址 ] #带多个的参数的视图函数 def args(req,arg1,arg2): return HttpResponse('arg1的值为{} arg2的值为{}'.format(arg1,arg2))请求地址为:http://127.0.0.1:8000/arg/11/22/http://127.0.0.1:8000/arg/11_22/(6) 一个视图函数 是否可以有多个路由地址路由地址和flask一样，可以多个路由指向同一个视图函数三、反向解析概述： 如果模板中的链接或者使用的url为硬链接 则路由地址一旦发生改变 所有地址都要修改 增加了后期代码的维护 所以所有地址都要动态生成 减轻后期维护作用于： 模板中使用方法：在helloworld/urls.py的 include 添加namespace属性url(r'^',include('App.urls',namespace='App')),给App/urls.py 的url方法 添加name属性url(r'^test/$', views.test,name='test'), # /test/在模板中使用 反向解析 去test视图函数 去test视图函数四、request对象(1) request对象每个视图函数 都必须有一个形参 接受django传递过来的用户请求的对象 request(2) 概述服务器接收到用户请求以后 会创建出request对象 视图的第一个参数 就是request对象(3) 属性path 只请求的路径method 获取请求的方式GET 获取get请求参数获取某一个参数request.GET.get('key')如果key重名request.GET.getlist('key')POST 获取POST的请求参数FILES 获上传文件COOKIES 获取请求过来的cookiesession 获取session数据META 包含了http请求的所有header头信息格式化后显示def requestAttr(request): values = request.META.items() html = [] for k,v in values: html.append(' {} {} '.format(k,v)) # return HttpResponse('request属性') return HttpResponse(' %s '%'\n'.join(html))常用的key值REMOTE_ADDR 库户端IP地址HTTP_USER_AGENT 浏览器和系统的信息的字符串HTTP_REFERER 获取从哪里点击过啦的链接地址(4) 方法get_full_path() 获取完整的请求（不包括域名和端口）get_host() 获取主机和端口is_ajax(…

第1节、安装配置
type: item
date: 2019-08-21T15:38:00+08:00
description: 一、安装命令：pip3 install django==1.11.4支持python解释器的版本为 2.7、3.4、3.5、3.6检查是否安装成功：>>> import django >>> django.get_version() 1.11.4注意：如果电脑是在windwos安装的django，所有代码书写都相同，如果django不能够运行，则查看计算机的名称是否为中文。二、创建django项目命令：django-admin startproject helloworld(项目名称)创建成功后：目录层级为helloworld/ helloworld/ __init__.py settings.py 配置文件 urls.py 路由地址文件 wsgi.py 项目的入口 项目部署的时候使用 manage.py 项目启动文件项目启动：python3 manage.py runserver [Ip:port] 127.0.0.1:8000 python3 manage.py runserver 0.0.0.0:8000 #任何地址都可以进行访问三、配置django数据库默认使用的是sqlite配置sqlite数据库代码settings.pyDATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }配置mysql数据库DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'djangopython1807',#数据库名称 'USER':'root', #用户名 'PASSWORD':'123456', #密码 'HOST':'127.0.0.1', #主机 'PORT':3306, #端口 } }在helloworld的init.py文件添加如下代码import pymysql pymysql.install_as_MySQLdb()四、想要添加你的模型,视图,url,模板,需要创建App命令：python3 manage.py startapp App(应用名称) 或者 django-admin startapp App五、添加路由地址，视图函数App/views.py 添加视图函数from django.shortcuts import render,HttpResponse # Create your views here. def index(request): return HttpResponse('hello django')render 渲染模板HttpResponse 直接构造响应helloworld/urls.py文件中from django.conf.urls import url from django.contrib import admin from App import views #导入视图函数的模块 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^', views.index), #访问首页视图 ]请求地址为为：http://127.0.0.1:8000s路由地址url的注意：url方法中的^的作用就是必须以当前的路由地址作为开头 如果^ 不存在 则是包含关系实例:urlpatterns = [ url(r'^admin/', admin.site.urls), # url(r'^$', views.index), url(r'^test/$',views.test), #/test/ url(r'test/',views.test), #/test/ ]上面俩个test的路由地址区别：带^是访问时候 地址必须为 127.0.0.1:8000/test/不带^ 访问地址为 127.0.0.1:8000/abctest/ #只要路由地址包含test 就可以访问成功六、将在自己的App下 创建自己的路由文件App/urls.py代码from django.conf.urls import url from App import views urlpatterns = [ url(r'^test/$', views.test), # /test/ ]helloworld/urls.py代码from django.conf.urls import url,include from django.contrib import admin urlpatterns = [ url(r'^adm…

第9节、flask部署（虚拟机环境）
type: item
date: 2019-08-19T11:28:00+08:00
description: 一、安装1.安装ssh新版本安装位 apt/apt-get老版本为 apt-get安装以后 ifconfig查看当前的ip地址如果网络不在同一个ip段 将网络模式设置为桥接2.安装pip3sudo apt install python3-pip在要安装项目的目录创建虚拟环境virtualenv venvsource activate # 开启虚拟开发环境模式退出 deactivatepip3 install uwsgi # 安装uwsgi二、配置uwsgi配置文件支持很多格式，我采用.ini格式，命名为uconfig.ini具体内容如下：socket指出了一个套接字，相当于为外界留出一个uwsgi服务器的接口。[uwsgi] # 外部访问地址，可以指定多种协议，现在用http便于调试，之后用socket # socket = 0.0.0.0:8000 # uwsgi的监听端口 # 指向项目目录 chdir = /home/xlg/blog/ # flask启动程序文件 wsgi-file = manage.py # flask在manage.py文件中的app名 callable = app plugins = python# 这行一定要加上，不然请求时会出现-- unavailable modifier requested: 0 --错误提示 # 处理器数 processes = 1 # 线程数 threads = 2 #状态检测地址 #stats = 127.0.0.1:9191socket和http的差别。从概念上来说，socket本身不是协议而是一种具体的TCP/IP实现方式，而HTTP是一种协议且基于TCP/IP。具体到这个配置这里来，如果我只配了socket = 127.0.0.1:5051的话，通过浏览器或者其他HTTP手段是无法成功访问的。而在uwsgi这边的日志里会提示请求包的长度超过了最大固定长度。另一方面，如果配置的是http = 127.0.0.1:5051的话，那么就可以直接通过一般的http手段来访问到目标。但这会引起nginx无法正常工作。正确的做法应该是，如果有nginx在uwsgi之前作为代理的话应该配socket，而如果想让请求直接甩给uwsgi的话那么就要配httppythonpath指出了项目的目录，module指出了项目启动脚本的名字而紧接着的wsgi-file指出了真正的脚本的文件名。callable指出的是具体执行.run方法的那个实体的名字，一般而言都是app=Flask(__name__)的所以这里是app。processes和threads指出了启动uwsgi服务器之后，服务器会打开几个并行的进程，每个进程会开几条线程来等待处理请求，显然这个数字应该合理，太小会使得处理性能不好而太大则会给服务器本身带来太大负担。daemonize项的出现表示把uwsgi服务器作为后台进程启动，项的值指向一个文件表明后台中的所有输出都重定向到这个日志中去。daemonize = /home/wyz/flask/server.log三、安装 nginxsudo apt-get install nginxNginx是轻量级、性能强、占用资源少，能很好的处理高并发的反向代理软件。Ubuntu 上配置 Nginx 也是很简单，不要去改动默认的 nginx.conf 只需要将/etc/nginx/sites-available/default文件替换掉就可以了。 新建一个 default 文件:server{ listen 80; # 服务器监听端口 server_name 10.0.121.116; # 这里写你的域名或者公网IP location / { uwsgi_pass 127.0.0.1:8000; # 转发端口，需要和uwsgi配置当中的监听端口一致 include uwsgi_params; # 导入uwsgi配置 #uwsgi_param UWSGI_PYTHON /home/自己创建的目录/venv; # Python解释器所在的路径（这里为虚拟环境） uwsgi_param UWSGI_PYTHON /usr/bin/python3; uwsgi_param UWSGI_CHDIR /home/xlg/blog/;# # 自己创建的目录 项目根目录 uwsgi_param UWSGI_SCRIPT manage:app; # 指定启动程序 #比如你测试用test.py文件，文件中app = Flask(name)，那么这里就填 test：app } }服务启动sudo service nginx startsudo service nginx stopsudo service ng…