这绝对不是只是Django入门

作者: 处在水深火热的iOS_林龙 | 来源:发表于2017-07-26 13:43 被阅读575次

    网上对Django教程都处在一个入门篇,对于想深入Django却不知道如何入手。本人是一名iOS开发者,在工作闲暇时间接触了python这么语言。在最近刚刚发布的语言排行榜中python已经跻身第一名。这得力于pyhton有非常多优秀的第三方库及今年特别火的人工智能(深度学习)。今天我想为大家分享的是Django这个Web服务器框架。了解Django会更好的了解服务器的工作,同时也巩固我对python的知识面。Django的大门准备打开,are you ready !?

    django.jpg

    项目是基于Mac系统 python 2.7版本。python工具是系统自带。如果是windows请自行百度安装python。首先第一步安装Django。我这边用的是pip工具。

     sudo pip install django
    

    我们开始搭建web框架

    1.创建项目
    # 指定路径,创建一个名为Django_api的项目
    cd Desktop
    django-admin.py startproject Django_api
    
    2.创建app(这里的app是指项目中的每个功能。如用户登陆注册可以放在同一个app中)
    #进入项目路径,创建一个叫用户的app
    cd django_api
    django-admin startapp users
    
    django目录.png
    3.查看是否部署成功
    python manage.py runserver 0.0.0.0:8000
    
    #July 26, 2017 - 01:49:25
    #Django version 1.11.2, using settings 'django_api.settings'
    #Starting development server at http://0.0.0.0:8000/
    #Quit the server with CONTROL-C.
    #提示此消息代表部署成功
    

    现在我来讲解一下目录中的文件有何作用

    django_api
    |-- _init_.py
    |-- settings.py
    |-- urls.py
    |-- wsgi.py
    |--users
    ||-- _init_.py
    ||-- admin.py
    ||-- apps.py
    ||-- models.py
    ||-- tests.py
    ||-- view.py
    |-- db.sqlite3
    |-- manage.py
    

    我们先讲解django文件目录下面的几个文件

    |-- init.py: 代表的是这是一个python文件
    |-- settings.py : 服务器全局设置文件
    |-- urls.py : url跳转控制器(根据url跳转对应的app中的view)
    |-- wsgi.py : wsgi用于配置部署至云服务器的
    |-- db.sqlite3: 系统默认用sqlite3数据库(如果用mySQL或其他数据库可忽略)
    |-- manage.py: 用于启动服务器,更新数据库等操作库

    users文件夹中

    ||-- init.py:代表的是这是一个python文件
    ||-- admin.py:配置admin后台管理系统的显示方式及功能
    ||-- apps.py :配置users这个app的基本参数
    ||-- models.py:存放用户模型
    ||-- tests.py:测试框架编写
    ||-- view.py : 具体实现逻辑


    讲解了项目的创建及文件的作用,现在开始进行项目编写

    首先了解一下setting文件的配置,我主要讲解一些重要的地方。如有些未提及,可自行搜索。

    ALLOWED_HOSTS = [u'0.0.0.0',u'127.0.0.1']
    

    ALLOWED_HOSTS设置的是允许用户通过那个url访问此服务器,如果未配置则访问不到该服务器,用于我们现在处于测试状态,我们可以写我们的本地地址以便于测试

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'users'
    ]
    

    在此配置中添加了最后一行'users',代表此app允许在此服务器上面运行,如果未配置却执行该app则会报错

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': "testDjango",
            'USER':'root',
            'PASSWORD':'123456',
            'HOST':'localhost',
        }
    }
    

    数据库我改为mysql数据库。注意key为大写且固定字段不可随意编写。请确保数据库配置正确。否则会编译不通过。
    NAME: 数据库名称
    USER: 数据库用户名
    PASSWORD:数据库密码
    HOST:数据库域名

    TEMPLATES = [
        {  'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR,"templates")],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    

    templates配置此路径后,在对应路径创建文件夹,可把HTML文件放入此路径中。服务器才能识别(故 html文件应该存放在templates文件下)

    STATIC_URL = '/static/'
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, "static")
    ]
    

    应在对应位置创建static文件夹,用于存放的是css等静态文件。


    基本配置完成后我们开始编写第一个请求

    打开urls文件编写相应代码(LoginView则在后面具体讲解如何编写)
    # urls.py
    from users.views import LoginView
    urlpatterns = [
        url(r'^login/',LoginView.as_view()),
    ]
    

    当用户发起http请求是访问到该路径如 http://0.0.0.0:8000/login?username=1&password=1
    时。代表的是访问该域名下的login路径,通过urlpatternp配置会跳转到LoginView.as_view()。传递的参数为username=1,password=1参数。

    打开users中的views.py 实现具体的逻辑处理
    class LoginView(View):
        def get(self,request):
            return HttpResponse("这是get请求")
    
        def post(self,request):
             return HttpResponse("这是post请求")
    

    这是一个很简单是处理请求。用户访问到该url时,返回的是一个字符串表明是什么请求。在下面我会告诉你如果去实现登陆,验证请求参数等


    实现登陆最重要的是通过用户表。对用户表进行增删改查功能。现在开始来讲解一下。

    1.打开users下的models.py文件

    # models.py
    from __future__ import unicode_literals
    from datetime import datetime
    from django.contrib.auth.models import AbstractUser
    
    class User(AbstractUser):
        nikeName = models.CharField(max_length=100,null=False,default="",verbose_name=u"昵称");
        birthday = models.DateField(verbose_name=u"生日",null=True,default=datetime.now);
        image    = models.ImageField(upload_to="image/%Y/%m",default="image/default.png")
    
        class Meta:
            verbose_name = "用户信息"
            verbose_name_plural = verbose_name;
    
        def __unicode__(self):
            return self.username;
    

    这个模型与普通创建的模型不一样,它是基于AbstractUser创建的模型,是重载了系统用户模型。可通过系统的方法来实现登陆等操作。这模型中添加了别名,生日,图片等字段。verbose_name代表的是添加一个别名用于在admin中显示的字段。重写class Meta:的道理也是一样。

    2.修改settings文件

    # settings.py
    # 重装自定义User表为系统用户表
    AUTH_USER_MODEL = 'users.User'
    

    3.更新到数据库

    django中有两个默认的方法,打开终端,cd 到目录下执行

    python manage.py makemigrations
    python manage.py migrate
    

    第一个是告诉数据库有什么表添加。第二个是创建表。

    4.添加数据

    user = User.objects.Create_user(username='123',password='123')
    

    创建系统用户模型序调用User.objects.Create_user() 而不是 User.objects.Create()需要注意。

    5.添加校验form

    创建一个user_form.py文件

    # user_form.py
    from django import forms
    class LoginFrom(forms.Form):
        username = forms.CharField(required=True)
        password = forms.CharField(required=True,min_length=5)
    

    6.view的实现

    from django.views.generic.base import View
    from django.http import request,HttpResponse
    from django.contrib.auth import authenticate,login
    from .models import User
    from user_forms import LoginFrom
    
    class LoginView(View):
        def get(self,request):
            form = LoginFrom(request.GET);
    
            #判断校验有没有正确
            if not form.is_valid():
                return HttpResponse(form.errors)
    
            #判断数据库有没有该有用户
            user = authenticate(username=user_name, password=pass_word);
    
            #如果有用户登陆
            if user is not None:
                login(request, user)
                return HttpResponse("登陆成功");
    
            return HttpResponse("登陆失败")
    
        def post(self,request):
            return HttpResponse("post请求暂未处理")
    
    

    django出现的html网页的处理,admin管理系统的处理,还有其他功能,将在下一章为你们展现。希望本章让大家对django有个了解。完成一次http请求后的django的执行过程。谢谢大家的阅读。

    下面是对数据库表的操作

    1.Person.objects.all()
    2.Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存
    3.Person.objects.get(name=name)  #get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter
    4.Person.objects.filter(name="abc")  # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
    5.Person.objects.filter(name__iexact="abc")  # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
    6.Person.objects.filter(name__contains="abc")  # 名称中包含 "abc"的人
    7.Person.objects.filter(name__icontains="abc")  #名称中包含 "abc",且abc不区分大小写
    8.Person.objects.filter(name__regex="^abc")  # 正则表达式查询
    9.Person.objects.filter(name__iregex="^abc")  # 正则表达式不区分大小写filter是找出满足条件的,当然也有排除符合某条件的
    10.Person.objects.exclude(name__contains="WZ")  # 排除包含 WZ 的Person对象
    11.Person.objects.filter(name__contains="abc").exclude(age=23)  # 找出名称含有abc, 但是排除年龄是23岁的0
    

    相关文章

      网友评论

      本文标题:这绝对不是只是Django入门

      本文链接:https://www.haomeiwen.com/subject/nmdnkxtx.html