python写数据库中间件_【django】-数据库操作&上下文管理器&中间件

0、子应用

子应用目录结构

配置子应用

1、创建表

创建模型:models.py

1 from django.db importmodels2

3 #Create your models here.

4

5 classCategory(models.Model):6 #默认表名为appname_classname

7 name = models.CharField(verbose_name='分类名称',max_length=20,unique=True)8 create_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)9 update_time = models.DateTimeField(verbose_name='修改时间',auto_now=True)10

11 classMeta:12 db_table = 'category' #创建表的表名

13 verbose_name = '分类'

14 verbose_name_plural =verbose_name15 ordering = ['-create_time','name']16

17 def __str__(self):18 return self.name

1 classArticle(models.Model):2 title = models.CharField(verbose_name='标题',max_length=25) #varchar

3 content = models.TextField(verbose_name='文章内容')4 img = models.ImageField(upload_to='article',blank=True)5 #db_constraint = Fasle,不会真的创建外键关联

6 category = models.ForeignKey(Category,on_delete=models.DO_NOTHING,db_constraint=False,verbose_name='分类')7 create_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)8 update_time = models.DateTimeField(verbose_name='修改时间',auto_now=True)9

10 classMeta:11 db_table = 'article' #创建表的表名

12 verbose_name = '文章'

13 verbose_name_plural =verbose_name14 ordering = ['-create_time']15

16 def __str__(self):17 return self.title

生成表

生成表结构:python3 manage.py makemigrations

同步表结构到数据库:python3 manage.py  migrate

2、表操作:增删改查;test.py

分类

from django.test importTestCaseimportos,django#Create your tests here.

#设置django的配置文件

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sky.settings')

django.setup()from user importmodels#增加

#方式一

category = models.Category(name='Python')

category.save()#方式二

models.Category.objects.create(name='Jmeter')

models.Category.objects.create(name='Vue')

models.Category.objects.create(name='Postman')#查询

#只能返回一条数据,返回多条会报错#如果指定的条件未匹配成功,也会报错

c1 = models.Category.objects.get(id=1)print(c1.name)print(c1.id)#返回的是一个list

query_set = models.Category.objects.filter(name='Python',id=1)print(query_set)

c=query_set.first()

c1=query_set[0]print(c.name)print(c1.name)from django.test importTestCaseimportos,django#Create your tests here.

#设置django的配置文件

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sky.settings')

django.setup()from user importmodels#删除

#方式一:单个删除

c1 = models.Category.objects.get(id=1)

c1.delete()#方式二:批量删除

q = models.Category.objects.filter(name='python1')

q.delete()#修改

#方式一:单个修改

c1 = models.Category.objects.get(id=2)

c1.name='Java'c1.save()#方式二:批量修改

q = models.Category.objects.filter(name='Python')

q.update(name='python1')

文章

已有分类

创建文章

from django.test importTestCaseimportos,django#Create your tests here.

#设置django的配置文件

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sky.settings')

django.setup()from user importmodels#增加文章

c1 = models.Category.objects.get(id=2)

a1= models.Article.objects.create(title='Jmeter',content='参数化',category=c1)

a1.save()

a2= models.Article.objects.create(title='Java',content='sprint boot项目 hello world!!',category_id=4)

a2.save()#查询某个分类下的所有文章

c_obj= models.Category.objects.get(name='Jmeter')print(c_obj)#方法一:手动通过分类查询文章

num= models.Article.objects.filter(category=c_obj)print(num)#方法二:一对多的时候,通过1,反查多

print(c_obj.article_set.all())

3、通过web页面请求创建文章

项目结构

编写views.py

from django.http importHttpResponseRedirectfrom django.shortcuts importrender,HttpResponsefrom . importmodelsdefarticle(request):print(request.method) #请求方式

print(request.GET) #通过url传参的方式,通过该方式获取请求值

print(request.POST) #获取请求值

print(request.COOKIES)print(request.path_info) #请求的路径 /post /cate

print(request.FILES) #获取文件

print(request.META) #请求头相关的都在这里

print(request.body) #body里面的内容

#创建文章

if request.method=='GET':return render(request,'post.html')else:

title= request.POST.get('title')

content= request.POST.get('content')

category= request.POST.get('category')

models.Article.objects.create(title=title,content=content,category_id=category)return HttpResponseRedirect('/')

配置urls.py

from django.contrib importadminfrom django.urls importpathfrom user importviews

urlpatterns=[

path('admin/', admin.site.urls),

path('index',views.user_info),

path('welcome',views.welcome),

path('',views.index),

path('category/',views.category),

path('post',views.article) #创建文章

]

模板文件:post.html

Title{#django默认启用了csrf验证#}

{% csrf_token %}

写文章的

title:
content:

{% for category in categories %}{{ category.name }}{% endfor %}

4、前端公共部分,复用

base.html

category.html

5、后端公共部分,复用:上下文管理器(如果每个view都需要返回同样的数据,那么就可以考虑使用上下文管理器;可写多个)

查询某个分类下的所有文章(页面右边需显示所有分类)

分类业务处理:views.py、urls.py

from django.http importHttpResponseRedirectfrom django.shortcuts importrender,HttpResponsefrom . importmodelsdefcategory(request,id):#只返回了某个分类,分类页面显示的文章分类列表为公共部分,通过上下文管理器处理获得

category_obj = models.Category.objects.get(id=id)

articles= models.Article.objects.filter(category=category_obj)return render(request,'category.html',{'articles':articles,'category_obj':category_obj})

from django.contrib importadminfrom django.urls importpathfrom user importviews

urlpatterns=[

path('admin/', admin.site.urls),

path('index',views.user_info),

path('welcome',views.welcome),

path('',views.index),

path('category/',views.category), #查询分类下的所有文章

path('post',views.article)

]

创建&配置上下文管理器

创建

代码如下

from . importmodelsdefprocess_category(request):print('上下文处理器')

categories=models.Category.objects.all()return {'categories':categories}

配置

请求流程图

6、中间件

应用:可利用实现mock接口平台开发

models.py

#mock平台开发

classInterface(models.Model):

name= models.CharField(verbose_name='接口名称',max_length=50)

path= models.CharField(verbose_name='接口路径',max_length=60,unique=True)

response= models.TextField(verbose_name='返回数据')classMeta:

db_table= 'interface'verbose_name= '接口'verbose_name_plural=verbose_namedef __str__(self):return self.name

middle_wares.py

from django.http importHttpResponsefrom django.middleware.common importMiddlewareMixinfrom . importmodelsclassTestMiddleWare(MiddlewareMixin):defprocess_request(self,request):#请求过来之后先走到这里

#利用中间件实现mock接口平台开发

print('request...')

path=request.path_info

interface= models.Interface.objects.filter(path=path).first()#print(interface)

ifinterface:returnHttpResponse(interface.response)#print(request.META)

defprocess_response(self,request,response):#拦截返回的

print('response...')returnresponsedefprocess_exception(self,request,exception):#拦截异常的

print('出异常了')return HttpResponse("努力抢救中!")

配置

请求示例

已有接口

请求

7、django自带的admin管理系统

创建用户命令:python3 manage.py  createsuperuser

编写admin.py

from django.contrib importadmin#Register your models here.

from . importmodelsclassArticleAdmin(admin.ModelAdmin):

list_per_page= 10 #每页最多展示多少条数据

list_display= ['id','title','img','create_time'] #展示哪些字段

list_filter= ['category'] #按照哪些字段来筛选

search_fields= ['title','content']classCategoryAdmin(admin.ModelAdmin):

list_per_page= 10 #每页最多展示多少条数据

list_display= ['id', 'name', 'create_time'] #展示哪些字段

list_filter= ['name'] #按照哪些字段来筛选

search_fields= ['name']classInterfaceAdmin(admin.ModelAdmin):

list_per_page= 10 #每页最多展示多少条数据

list_display= ['id','name'] #展示哪些字段

search_fields= ['name']

admin.site.register(models.Article,ArticleAdmin)

admin.site.register(models.Category,CategoryAdmin)

admin.site.register(models.WebSite),

admin.site.register(models.Interface,InterfaceAdmin)

问题:已解决

升级:pip install django==2.1.7

pip3 install Django –upgrade

查看Django版本: python3 -m django --version

删除已有数据库

重新生成:

python3 manage.py makemigrations

python3 manage.py migrate

python3 manage.py  createsuperuser

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值