这绝对不是只是Django入门

网上对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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容