环境版本信息:

Django               2.0.7    
mysqlclient          1.3.13    
pip                  10.0.1   
Python 3.6.4

用户登陆

简单的login功能函数,通过POST获取到的用户名密码信息会跟数据库中进行比对,如果成功,传参给index.html并返回,如果失败,继续调用login:

def login(request):
    if request.method == "GET":
        return render(request, "login.html")

    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")

        user = userinfo.objects.filter(user = username, password = password)
        if user:
            return render(request, 'index.html', {'username': username})
         #   return redirect('/index', {'username': username})
        else:
            return render(request, 'login.html')

这里登陆成功跳转到index页面,用render方法或redirect方法都是可以实现的。

RESTful API

给个链接参考一下,写的很好:
http://www.cnblogs.com/zivwong/p/7417989.html

用的其实就是Django REST framework

装环境就不说了,pip直接装。我的是djangorestframework 3.8.2
然后需要新建一个app,例如python manage.py startapp apps
简单来说,一个简单的列表功能的实现,需要改5个文件:
settings.py, 加个apps:

INSTALLED_APPS = [
   ...
   'rest_framework',
   ...
]

views.py,定义一个类:

class ServerList(APIView):
    def get(self, request):
        gg = serverinfo.objects.all()
        serializer = Serverserializer(gg, many=True)
        return Response(serializer.data)

urls.py, 加一行url:

path('serverlist/', views.ServerList.as_view()),

models.py,新建类:

class serverinfo(models.Model):
    id = models.AutoField(primary_key=True, null=False, verbose_name='ID')
    server_name = models.CharField(max_length=50, null=False, verbose_name='服务器名称')
    type = models.CharField(max_length=50, null=False, verbose_name='类型')
    server_ip = models.CharField(max_length=16, null=False, verbose_name='IP')

建了models之后,不要忘了makemigration和migrate
新建一个文件serializers.py , 这个文件有点儿类似django中的forms.py, 不过功能更强大,代码类似于:

from rest_framework import serializers

class Serverserializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    server_name = serializers.CharField(required=True, max_length=50)
    type = serializers.CharField(required=True, max_length=50)
    server_ip = serializers.CharField(required=True, max_length=16)

然后就可以运行了。这就是一个最简单的restful实现。 当然,实际运行代码会比这个复杂的多。

pip install httpie 安装httpie模块便于对api进行调试

django-guardian

guardian是为Django提供额外的对象权限的身份验证后端。注意,可以对对象进行权限验证。 安装:

pip install django-guardian

settings里文件的配置,两个地方需要更改:

INSTALLED_APPS = [
    ....
    'guardian',
]

....

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'guardian.backends.ObjectPermissionBackend',
)

修改一下上面的models的serverinfo,增加一个字段外键到User:

from django.db import models
from django.contrib.auth.models import User

class ServerInfo(models.Model):
    id = models.AutoField(primary_key=True, null=False, verbose_name='ID')
    server_name = models.CharField(max_length=50, null=False, verbose_name='服务器名称')
    type = models.CharField(max_length=50, null=False, verbose_name='类型')
    server_ip = models.CharField(max_length=16, null=False, verbose_name='IP')
    reported_by = models.ForeignKey(User, on_delete=models.CASCADE)
    
    class Meta:
        permissions = (
            ('view_task', 'View task')
        )

注意后面的reported_by中的on_delete,这儿有雷。在django2.0后续的版本中必须要加这个on_delete后面这一串, 否则会报错,参考https://www.cnblogs.com/phyger/p/8035253.html

另外说明一下:Meta中的permissions是我们自定义的权限,当我们调用migrate命令的时候,view_task将会被添加到默认的权限集合中。 默认情况下Django为每个model准备了3个权限:
add_model名
change_model名
delete_model名

FFwechat FFalipay