注意 每次开发的时候 都先要理清楚要做什么?要实现怎么样的功能?要怎么实现?
在 django中
一般分这几步走:设计url,设计视图函数,从数据库中拿数据进行渲染
这里其实是django的请求生命周期
1、请求生命周期
-
wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask、Django)
-
中间件,帮助我们对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session
-
路由匹配
-
视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染
-
中间件,对响应的数据进行处理。
-
wsgi,将响应的内容发送给浏览器。
2、什么wsgi
wsgi:web服务网关接口
实现该协议的模块:
- wsgiref(测试版本,性能特别差)
- werkzurg
- uwsig
wsgiref示例:
from wsgiref.simple_server import make_server
def run_server(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ] #字节
if __name__ == '__main__':
httpd = make_server('127.0.0.1', 8000, run_server)
httpd.serve_forever()
werkzeug示例:
from werkzeug.wrappers import Response
from werkzeug.serving import run_simple
def run_server(environ, start_response):
response = Response('hello')
return response(environ, start_response) #对象
if __name__ == '__main__':
run_simple('127.0.0.1', 8000, run_server)
3、视图
FBV
url - 函数
CBV
url - view
FBV(function base view)与CBV(class base view)本质是一样的,只是fbv基于函数,cbv基于类。只不过fbv较cbv往后多执行了几步。
4、rest-framework
rest-framework从dispatch方法开始介入,执行完视图,如果有rest-framework组件,就执行rest-framework。
5、restfui规范
下面开始我们的设计
1:设计用户登录url
1.1在url中from web.views import account
urlpatterns = [
url(r'^login/$', account.login, name='login'),]
2:设计视图
from django.shortcuts import render, redirect, reverse
from rbac import models
from rbac.service.SetPermissions import SetPermission
def login(request):
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('pwd')
obj = models.User.objects.filter(name=user, password=pwd).first()
if not obj:
return render(request, 'login.html')
# 重点在这呢
# 在外边的rbac新建一个文件夹 里面存放这个初始化权限信息的函数
# 传request是为了方便将信息存到seesion中,传入当前登录的对象是为了查出对象所具有的权限
SetPermission(request, obj)
# 登录成功和设置好session之后跳转到自己定义的页面 比如客户展示
return redirect(reverse('customer_list'))
return render(request, 'login.html')
3:查询数据
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/12/31 0031 17:23
# @Author : BigC
# @Site :
# @File : SetPermissions.py
# @Software: PyCharm
# @contact: 1516499114@qq.com
from django.conf import settings
def SetPermission(request, obj):
ret = obj.roles.all().filter(permissions__url__isnull=False
).values('permissions__url',
'permissions__title',
'permissions__menu',
'permissions__parent',
'permissions__name',
'permissions__menu__title',
'permissions__menu__icon',
'permissions__menu__weight',
'permissions__id',
'permissions__name',
'permissions__menu_id',
).distinct()
menu_dict = {}
permission_dict = {}
print(ret)
# {
# 'permissions__url': 'customer/list/',
# 'permissions__title': '查看客户',
# 'permissions__menu': 1,
# 'permissions__parent': None,
# 'permissions__name': 'customer/list/',
# 'permissions__menu__title': '查看客户',
# 'permissions__menu__icon': 'fa-book',
# 'permissions__menu__weight': 1
# }
for item in ret:
print(item)
permission_dict['permissions__name'] = ({
'panme': item['permissions__parent__name'],
'title': item['permissions_title'],
'url': item['permissions__menu'],
'id': item['permissions__id'],
'pid': item['permissions__parent__id'],
})
menu_dict = []
menu_id = item.get('permissions__menu_id')
if menu_id not in menu_dict:
menu_dict[menu_id] = {
'title': item.get('permissions__menu__title'),
'icon': item.get('permissions__menu__icon'),
'weight': item.get('permissions__menu__weight'),
'children': [{
'title': item.get('permissions__title'),
'url': item.get('permissions_url'),
'id': item.get('permissions__id'),
}],
}
else:
menu_dict[menu_id]['children'].append(
{'title': item.get('permissions__title'),
'url': item.get('permissions_url'),
'id': item.get('permissions__id'), }
)
# 存权限
request.session[settings.PERMISSION_SESSION_KEY] = permission_dict
# 存菜单
request.session[settings.PERMISSION_MENU_KEY] = menu_dict