文武的客 - python
type: channel
link: https://www.binscor.top/index.php/tag/python/
items: 第8节、celerys及中间件
items: 第7节、站点、分页、文件上传及富文本编辑器
items: 第6节、系统User及静态资源
items: 第5节、缓存-发送邮件
items: 第4节、model
items: 第3节、模板
items: 第2节、视图
items: 第1节、安装配置
items: 第8节、Model02以及文件迁移
items: 第6节、扩展库的使用

第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…

第8节、Model02以及文件迁移
type: item
date: 2019-08-19T11:27:00+08:00
description: 一、Model对数据的操作3种办法(1) 最原始的 提交 和 回滚#最原始的添加 提交或者回滚 每次都需要 @test.route('/insert_one/') def insert_one(): try: # u = User(username='zhangshang',sex=False,age=18) u = User('lisi',True,20) db.session.add(u) db.session.commit() except: db.session.rollback() return 'insert_one'注意：每次都需要提交和回滚(2) 在settings.py进行配置SQLALCHEMY_COMMIT_ON_TEARDOWN = True每次添加或者保存，修改，删除数据 都不需要commit() 或者 rollback()实例app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True #设置自动提交 #settings.py已经设置为数据自动提交 @test.route('/auto_insert_one/') def auto_insert_one(): u = User('王五',False,30) db.session.add(u) return 'insert_one'(3) 自定义增删改的基类 进行封装user.py中base类的书写class Base: #添加一条数据 def save(self): try: db.session.add(self) db.session.commit() except: db.session.rollback() #添加多条数据 @staticmethod def save_all(*args): try: db.session.add_all(args) db.session.commit() except: db.session.rollback() #自定义删除基类 def delete(self): try: db.session.delete(self) db.session.commit() except: db.session.rollback()user.py中base类的使用class User(Base,db.Model): __tablename__ = 'user' id = db.Column(db.Integer,primary_key=True) username = db.Column(db.String(12),index=True) sex = db.Column(db.Boolean,default=True) age = db.Column(db.Integer,default=20) icon = db.Column(db.String(40),default='default.jpg') def __init__(self,username,sex=True,age=18,icon='default.jpg'): self.username = username self.sex = sex self.age = age self.icon = icon蓝本文件中的使用#使用自定义的base类 进行添加 自带提交和回滚 @test.route('/self_insert_one/') def self_insert_one(): u = User('兆六',False,20) u.save() return 'insert_one' #添加多条数据 @test.route('/self_insert_many/') def self_insert_many(): sex = [True,False] u1 = User(random.randrange(1000,10000),sex[random.randint(0,1)],random.randint(1,100)) u2 = User(random.randrange(1000,10000),sex[random.randint(0,1)],random.randint(1,100)) User.save_all(u1,u2) return '添加多条' #自定义删除方法的使用 @test.route('/delete/') def delete(): u = User.query.get(2) u.delete() return '删除' #自定义修改方法的使用 @test.route('/update/') def update(): u = User.query.get(2) u.username = '…

第6节、扩展库的使用
type: item
date: 2019-08-19T11:26:00+08:00
description: 一、flash消息的显示概述： 当用户状态发生改变等等的处理时， 需要给用户显示出提示信息 flash就是实现这个功能的导入： from flask import flash,get_flashed_messagesflash 存数据get_flashed_messages() 获取flash存储的数据实例manage.py#ajax处理登录的视图 @app.route('/do_login/',methods=['POST']) def dologin(): # print(request.args.get('username')) username = request.form.get('username') userpass = request.form.get('userpass') if username == 'zhangsan': if userpass == '123456': flash("登录成功") # flash("登录成功2") # flash("登录成功3") # print(get_flashed_messages()) data = {'code':200} else: data = {'code':400} else: data = {'code':404} return jsonify(data)base.html{% for message in get_flashed_messages() %} × Warning! {{ message }} SS {% endfor %}二、flask-moment 时间显示的扩展库概述： 专门负责时间的显示 可以显示当前时间 可以计算时间的差值附：用法导入：from flask_moment import Momentmanage.pyfrom flask_moment import Moment #时间模块 from datetime import datetime,timedelta #导入时间模块 moment = Moment(app) manager = Manager(app) @app.route('/') def index(): nowtime = datetime.utcnow()+timedelta(seconds=-60) #前60秒的时间 return render_template('index.html',nowtime=nowtime)index.html 首页 {{ nowtime }} {{ moment(nowtime).format('L') }} {{ moment(nowtime).format('LL') }} {{ moment(nowtime).format('LLL') }} {{ moment(nowtime).format('LLLL') }} {{ moment(nowtime).format('YYYY-MM-DD') }} {{ moment(nowtime).fromNow() }} {% endblock %} {% block scripts %} {{ super() }} {{ moment.include_moment() }} #导入moment显示的js代码 {{ moment.locale('zh-CN') }} #格式化中国的时间 {% endblock %}三、文件上传1.原生文件上传(1)简单上传manage.py@ys.route('/form/',methods=['GET','POST']) def form(): # if request.method == 'POST' and request.files.get('photo'): if request.method == 'POST' and 'photo' in request.files: # print(request.files) #获取传递过来的文件 file = request.files.get('photo') #获取文件名称 filename = file.filename #存储上传的路径和名字 file.save(os.path.join(os.getcwd(),'static/upload/'+filename)) return 'ok' return render_template('ysfile/form.html')form.html 文件上传 附：python生成随机图形验证码(2)添加条件判断的上传manage.pyfrom flask import Blueprint,render_template,request,current_app import string…