Django基础(四)

Django admin 自带的验证:

from django.contrib.auth.decorators import login_required
from django.contrib.auth import ahthenticate,login,logout

@login_required        #只有用户登陆之后才执行下面操作
def index(request):
    return render(request,‘index.html‘)

def acc_login(request):    #验证用户登陆函数
    if request.method == ‘POST‘:
        user = authenticate(username=request.POST.get(‘username‘),password=request.POST.get(‘password‘))
        if user is not None:        # 如果验证成功
            login(request,user)
            return HttpResponseRedirect(‘/‘)
        else:
            login_err = u‘用户名或密码错误‘
            return render(request,‘login.html‘,{‘login_err‘:login_err})
    return render(request,‘login.html‘)

def acc_logout(request):
    logout(request)
    return HttpResponseRedirect(‘/‘)

 

 

Django 分页

后端代码

def customers(request):
    customers_set = models.Customer.objects.all()
    # 生成分页实例,第一个参数为query_set对象,第二个参数为每页显示多少条数据
    paginator = Paginator(customers_set, 1)
    # 从请求中获取页码
    page = request.GET.get("page")
    try:
        customers_iter = paginator.page(page)
    # 如果获取的page不是数字,就默认返回第一页
    except PageNotAnInteger:
        customers_iter = paginator.page(1)
    # 如果获取的page不存在,就默认返回最后一页
    except EmptyPage:
        customers_iter = paginator.page(paginator.num_pages)

    return render(request, "crm/customers.html", {"customers": customers_iter})

 

自定义template tags

首先创建目录和文件

polls/            #app名,在app下创建目录
    __init__.py
    models.py
    templatetags/        #目录名称,必须是这个名称
        __init__.py
        poll_extras.py        # 自定义tag文件
    views.py

poll_extra.py

from django import template
from django.utils.html import format_html

register = template.Library()

@register.simple_tag()
def guess_page(current_page,loop_num):
    offset = abs(current_page - loop_num)
    if offset < 3:
        if current_page == loop_num:
            page_els = ‘‘‘<li class="active"><a href="?page=%s">%s</a></li>‘‘‘ %(loop_num,loop_num)
        else:
            page_els = ‘‘‘<li class=""><a href="?page=%s">%s</a></li>‘‘‘ %(loop_num,loop_num)
        return format_html(page_els)
    else:
        return ‘‘

 

权限管理

Django 自带有基本的权限管理,但是粒度和限制的纬度都只是针对具体的表。

写权限注意事项:

  1. 权限系统的设计对开发者,用户要实现透明
  2. 权限要易扩展,灵活
  3. 权限要能实现非常小的粒度控制,甚至细致到一个按键某个用户是否能操作。

想对一个功能实现权限控制,要做到只能在views方法上加一个装饰器就行了,比如:

@check_permission
@login_required
def customer_detail(request,customer_id):
    customer_obj = models.Customer.objects.get(id=customer_id)
    customer_form = forms.CustomerDetailForm(instance=customer_obj)

    if request.method == ‘POST‘:
        customer_form = forms.CustomerDetailForm(request.POST,instance=customer_obj)
        if customer_form.is_valid():
            customer_form.save()
            parent_base_url = ‘/‘.join(request.path.split(‘/‘)[:-2])
            print("url:",parent_base_url )
            return  redirect(parent_base_url)
        else:
            print(customer_form.errors)
    return  render(request,‘crm/customer_detail.html‘,{‘customer_form‘:customer_form})

 

自己写一个权限控制

from django.core.urlresolvers import resolve
from django.shortcuts import render,redirect

perm_dic = {
    ‘view_customer_list‘: [‘customer_list‘,‘GET‘,[]],
    ‘view_customer_info‘: [‘customer_detail‘,‘GET‘,[]],
    ‘edit_own_customer_info‘: [‘customer_detail‘,‘POST‘,[‘test‘]],
}

def perm_check(*args,**kwargs):
    request = args[0]
    url_resovle_obj = resolve(request.path_info)
    current_url_namespace = url_resovle_obj.url_name
    #app_name = url_resovle_obj.app_name #use this name later
    print("url namespace:",current_url_namespace)
    matched_flag = False # find matched perm item
    matched_perm_key = None
    if current_url_namespace is not None:#if didn‘t set the url namespace, permission doesn‘t work
        print("find perm...")
        for perm_key in perm_dic:
            perm_val = perm_dic[perm_key]
            if len(perm_val) == 3:#otherwise invalid perm data format
                url_namespace,request_method,request_args = perm_val
                print(url_namespace,current_url_namespace)
                if url_namespace == current_url_namespace: #matched the url
                    if request.method == request_method:#matched request method
                        if not request_args:#if empty , pass
                            matched_flag = True
                            matched_perm_key = perm_key
                            print(‘mtched...‘)
                            break #no need looking for  other perms
                        else:
                            for request_arg in request_args: #might has many args
                                request_method_func = getattr(request,request_method) #get or post mostly
                                #print("----->>>",request_method_func.get(request_arg))
                                if request_method_func.get(request_arg) is not None:
                                    matched_flag = True # the arg in set in perm item must be provided in request data
                                else:
                                    matched_flag = False
                                    print("request arg [%s] not matched" % request_arg)
                                    break #no need go further
                            if matched_flag == True: # means passed permission check ,no need check others
                                print("--passed permission check--")
                                matched_perm_key = perm_key
                                break

    else:#permission doesn‘t work
        return True

    if matched_flag == True:
        #pass permission check
        perm_str = "crm.%s" %(matched_perm_key)
        if request.user.has_perm(perm_str):
            print("\033[42;1m--------passed permission check----\033[0m")
            return True
        else:
            print("\033[41;1m ----- no permission ----\033[0m")
            print(request.user,perm_str)
            return False
    else:
        print("\033[41;1m ----- no matched permission  ----\033[0m")
def check_permission(func):

    def wrapper(*args,**kwargs):
        print("---start check perms",args[0])
        if not perm_check(*args,**kwargs):
            return render(args[0],‘crm/403.html‘)
        return func(*args,**kwargs)
        #print("---done check perms")
    return wrapper

时间: 2024-10-08 04:36:39

Django基础(四)的相关文章

Django基础四之模板系统

一 语法   模板渲染的官方文档 关于模板渲染你只需要记两种特殊符号(语法): {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二 变量 在Django的模板语言中按此语法使用:{{ 变量名 }}. 当模版引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身. 变量的命名包括任何字母数字以及下划线 ("_")的组合. 变量名称中不能有空格或标点符号. 深度查询据点符(.)在模板语言中有特殊的含义.当模版系统遇到点("."),它将以这样

Django基础(四)

Django-4 知识预览 分页器(paginator) COOKIE 与 SESSION Django的用户认证 FORM 回到顶部 分页器(paginator) 分页器的使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 >>> from django.core.pag

Django基础四&lt;二&gt;(OneToMany和 ManyToMany,ModelForm)

上一篇博文是关于setting.py文件数据库的配置以及model与数据库表关系,实现了通过操作BlogUser,把BlogUser的信息存入后台数据库中.实际开发中有许多东西是相互联系的,除了数据的显示和存储之外,我们也要理清各种数据对象之间的关系.Django框架定义了三种关系模型: OneToOne OneToOne(一对一) :这种对应关系最简单,就是字面的意思一对一.django用OneToOneField来表示这种对应关系. OneToMany OneToMany(一对多) :也是常

Django基础和基本使用

Django基础 Django是Python下的一款著名的Web框架 框架 任何语言进入到高级部分时,会有认证.session.http.连接数据库等等功能操作,没有框架时需要自己实现 框架 是整个或部分系统的可重用设计,表现为一组抽象组件及组件实例间交互的方法: Django优点 自带轮子众多,方便快速开发 如Auth,Cache,模板等 天生的MVC设计模块 实用的后台管理 自带ORM,Template,Form,Auth核心组件 简洁的url设计 周边插件丰富 Django缺点 重 同步阻

Django基础三之视图函数

Django基础三之视图函数 本节目录 一 Django的视图函数view 二 CBV和FBV 三 使用Mixin 四 给视图加装饰器 五 Request对象 六 Response对象 一 Django的视图函数view 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. 无论视图本身包含什么逻辑,都要返回响应.代码写在哪里也无所谓,只要它在你当前项

Django基础一之web框架的本质

Django基础一之web框架的本质 一 web框架的本质及自定义web框架 ? 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响应,按照http协议的请求协议发送请求,服务端按照http协议的响应协议来响应请求,这样的网络通信,我们就可以自己实现Web框架了. 通过对socket的学习,我们知道网络通信,我们完全可以自己写了,因为socket就是做网络通信用的,下面我们就基于sock

Django基础九之中间件

目录 Django基础九之中间件 一 前戏 二 中间件介绍 三 自定义中间件 自定义一个中间件示例 process_request process_response process_view process_exception process_template_response(用的比较少) 四 中间件执行流程 五 中间件版登陆认证 六 中间件案例 应用案例 1.做IP访问频率限制 2.URL访问过滤 源码试读 Django基础九之中间件 本节目录 一 前戏 我们在前面的课程中已经学会了给视图函

Python Day19-20(Django基础)

一.Django基础 1.基本配置补充 可以用pycharm一键创建工程和APP 其他常用命令: python manage.py runserver 1.1.1.1:8000 python manage.py startapp appname python manage.py syncdb python manage.py makemigrations python manage.py migrate python manage.py createsuperuser 数据库配置 setting

Django 基础教程

Django 基础教程 这是第一篇 Django 简介 ?  Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站! 你一定可以学会,Django 很简单!本教程一直在更新,从开始写到现在大概写了一年多了,现在也一直在坚持写,每一篇教程都可能随时更新,可以在网站首页看到最近更新的情况. 我阅读学习了全部的 Django英文的官方文档,觉得国内比较好的Django学习资源不多,所以决定写自己的教程.本教程开始写的时候是 Django 的版本是 1.6,

Python之路-(js正则表达式、前端页面的模板套用、Django基础)

js正则表达式 前端页面的模板套用 Django基础 js正则表达式: 1.定义正则表达式 /.../  用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m 表示多行匹配 登录注册验证: test: 判断字符串是否符合规定的规则 rep = /\d+/;   (定义规则) rep.test('')   (引号里面必须包含字母和数字才返回true,否则为false) rep = /^\d+$/; (只有是纯数字时候才返回true,否则是false) exe