Django--常用语法及命令

1. 搭建环境

首先安装虚拟环境,命令如下:

sudo pip3 install virtualenv #安装虚拟环境

接下来还要安装虚拟环境扩展包,命令如下:

sudo pip3 install virtualenvwrapper

安装虚拟环境包装器的目的是使用更加简单的命令来管理虚拟环境。

修改用户家目录下的配置文件.bashrc,添加如下内容:

export WORKON_HOME=$HOME/.virtualenvs

source /usr/local/bin/virtualenvwrapper.sh

使用source .bashrc命令使配置文件生效。

创建python3虚拟环境的命令如下:

mkvirtualenv -p python3 虚拟环境名称

例:

mkvirtualenv -p python3 py_django

小总结

· 创建成功后,会自动工作在这个虚拟环境上。

· 创建虚拟环境需要联网。

· 工作在虚拟环境上,提示符最前面会出现"(虚拟环境名称)"。

· 所有的虚拟环境,都位于/home/python/下的隐藏目录.virtualenvs下。

退出

退出虚拟环境的命令如下:

deactivate

查看与使用

查看所有虚拟环境的命令如下:

提示:workon后面有个空格,再按两次tab键。

workon 两次tab键

删除

删除虚拟环境的命令如下:

rmvirtualenv 虚拟环境名称

例:

先退出:deactivate

再删除:rmvirtualenv py_django

包操作

在虚拟环境中可以使用pip命令操作python包,安装命令如下:

pip install 包名称

注意:在虚拟环境中不可使用sudo pip install 包名称 来安装python包,这样安装的包实际是安装在了真实的主机环境上。

查看已安装的python包命令如下:

pip list  

pip freeze

这两个命令都可已查看当前工作的虚拟环境中安装了哪些python包,只是显示的格式稍有不同。

安装django包

后面要学习使用django,我们使用的是django1.8.2的版本,这是一个稳定性高、使用广、文档多的版本,注意,如果前面删除过虚拟环境py_django,则需要先创建一下,否则直接安装django包即可。

mkvirtualenv py_django

然后安装django1.8.2的包,命令如下:

pip install django==1.8.2

创建项目

在当前用户的某个目录下创建项目,这样不会发生权限问题。

此处在/home/python/pytest/目录下创建项目

cd /home/python/

mkdir pytest

cd pytest

创建项目的命令如下:

django-admin startproject 项目名称

例:

django-admin startproject test1

项目默认目录说明

进入test1目录,查看目录树形结构

cd test1

tree

---------------------------------------------------

修改为使用MySQL数据库,代码如下:

将引擎改为mysql,提供连接的主机HOST、端口PORT、数据库名NAME、用户名USER、密码PASSWORD。

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.mysql',

        'NAME': 'test2', #数据库名字,

        'USER': 'root', #数据库登录用户名

        'PASSWORD': 'mysql', #数据库登录密码

        'HOST': 'localhost', #数据库所在主机

        'PORT': '3306', #数据库端口

    }

}

注意:数据库test2 Django框架不会自动生成,需要我们自己进入mysql数据库去创建。

下面是手动创建数据库,打开新终端,在命令行登录mysql,创建数据库test2。

注意:设置字符集为utf8

create database test2 charset=utf8;

---------------------------------------------------

创建应用

使用一个应用开发一个业务模块,创建应用的命令如下:

python manage.py startapp booktest

安装应用

应用创建成功后,需要安装才可以使用,也就是建立应用和项目之间的关联,在test1/settings.py中INSTALLED_APPS下添加应用的名称就可以完成安装。

安装成功之后,在test2/_init_.py文件中加上如下代码:

import pymysql

pymysql.install_as_MySQLdb()

 

开发服务器

在开发阶段,为了能够快速预览到开发的效果,django提供了一个纯python编写的轻量级web服务器,仅在开发阶段使用。

运行服务器命令如下:

python manage.py runserver ip:端口

例:

python manage.py runserver

可以不写IP和端口,默认IP是127.0.0.1,默认端口为8000

 

设计模型:

1.定义模型类

模型类定义在models.py文件中,继承自models.Model类。

说明:不需要定义主键列,在生成时会自动添加,并且值为自动增长。

模型类的设计

根据设计,在models.py中定义模型类如下:

from django.db import models

 

class BookInfo(models.Model):

    btitle = models.CharField(max_length=20)

    bpub_date = models.DateField()

2.迁移

迁移前目录结构如下图:

 

迁移由两步完成:

· 1.生成迁移文件:根据模型类生成创建表的迁移文件。

· 2.执行迁移:根据第一步生成的迁移文件在数据库中创建表。

生成迁移文件命令如下:

python manage.py makemigrations

执行生成迁移文件命令后,会在应用booktest目录下的migrations目录中生成迁移文件。

 

执行迁移命令如下:

python manage.py migrate

当执行迁移命令后,Django框架会读取迁移文件自动帮我们在数据库中生成对应的表格。
默认生成的表名称

细心的同学会发现我们上面生成的表的名字叫做booktest_bookinfo,booktest是应用的名字,bookinfo是模型类的名字。

 

 

设计英雄类

打开booktest/models.py,定义英雄类代码如下:

class HeroInfo(models.Model):

    hname = models.CharField(max_length=20)

    hgender = models.BooleanField()

    hcomment = models.CharField(max_length=100)

    hbook = models.ForeignKey('BookInfo')

这里要说明的是,BookInfo类和HeroInfo类之间具有一对多的关系,这个一对多的关系应该定义在多的那个类,也就是HeroInfo类中。

在我们之后迁移生成表的时候,Django框架就会自动帮我们在图书表和英雄表之间建立一个外键关系。

生成迁移文件:

python manage.py makemigrations

执行迁移的命令:

python manage.py migrate

3.数据操作

完成数据表的迁移之后,下面就可以通过进入项目的shell,进行简单的API操作。如果需要退出项目,可以使用ctrl+d快捷键或输入quit()。

进入项目shell的命令:

python manage.py shell

首先引入booktest/models中的类:

from booktest.models import BookInfo,HeroInfo

新建图书对象:

b=BookInfo()

b.btitle="射雕英雄传"

from datetime import date

b.bpub_date=date(1991,1,31)

b.save()

查询所有图书信息:

BookInfo.objects.all()

查找图书信息并查看值:

b=BookInfo.objects.get(id=1)

b

b.id

b.btitle

b.bpub_date

修改图书信息:

b.bpub_date=date(2017,1,1)

b.save()

b.bpub_date

删除图书信息:

b.delete()

对象的关联操作

对于HeroInfo可以按照上面的方式进行增删改查操作。

创建一个BookInfo对象

b=BookInfo()

b.btitle='abc'

b.bpub_date=date(2017,1,1)

b.save()

创建一个HeroInfo对象

h=HeroInfo()

h.hname='a1'

h.hgender=False

h.hcomment='he is a boy'

h.hbook=b

h.save()

图书与英雄是一对多的关系,django中提供了关联的操作方式。

获得关联集合:返回当前book对象的所有hero。

b.heroinfo_set.all()

 

管理站点:

使用Django的管理模块,需要按照如下步骤操作:

· 1.管理界面本地化

· 2.创建管理员

· 3.注册模型类

· 4.自定义管理页面

1.管理界面本地化

本地化是将显示的语言、时间等使用本地的习惯,这里的本地化就是进行中国化,中国大陆地区使用简体中文,时区使用亚洲/上海时区,注意这里不使用北京时区表示。

打开test1/settings.py文件,找到语言编码、时区的设置项,将内容改为如下:

LANGUAGE_CODE = 'zh-hans' #使用中国语言

TIME_ZONE = 'Asia/Shanghai' #使用中国上海时间

2.创建管理员

创建管理员的命令如下,按提示输入用户名、邮箱、密码。

python manage.py createsuperuser

接下来启动服务器。

python manage.py runserver

打开浏览器,在地址栏中输入如下地址后回车。

http://127.0.0.1:8000/admin/

3.注册模型类

登录后台管理后,默认没有我们创建的应用中定义的模型类,需要在自己应用中的admin.py文件中注册,才可以在后台管理中看到,并进行增删改查操作。

打开booktest/admin.py文件,编写如下代码:

from django.contrib import admin

from booktest.models import BookInfo,HeroInfo

 

admin.site.register(BookInfo)

admin.site.register(HeroInfo)

到浏览器中刷新页面,可以看到模型类BookInfo和HeroInfo的管理了。

4.自定义管理页面

在列表页只显示出了BookInfo object,对象的其它属性并没有列出来,查看非常不方便。 Django提供了自定义管理页面的功能,比如列表页要显示哪些值。

打开booktest/admin.py文件,自定义类,继承自admin.ModelAdmin类。

· 属性list_display表示要显示哪些属性

class BookInfoAdmin(admin.ModelAdmin):

    list_display = ['id', 'btitle', 'bpub_date']

· 修改模型类BookInfo的注册代码如下

admin.site.register(BookInfo, BookInfoAdmin)

· 刷新BookInfo的列表页,所有属性都显示出来了

视图及URL:

使用视图时需要进行两步操作:

* 1.定义视图函数

* 2.配置URLconf

1.定义视图

视图就是一个Python函数,被定义在views.py中。

视图的必须有一个参数,一般叫request,视图必须返回HttpResponse对象,HttpResponse中的参数内容会显示在浏览器的页面上。

打开booktest/views.py文件,定义视图index如下

from django.http import HttpResponse

 

def index(request):

    return HttpResponse("index")

2.配置URLconf

booktest/应用下创建urls.py文件,定义代码如下:

from django.conf.urls import url

from booktest import views

urlpatterns = [

    url(r'^$', views.index),

]

包含到项目中:打开test1/urls.py文件,为urlpatterns列表增加项如下:

url(r'^', include('booktest.urls')),

test1/urls.py文件完整代码如下:

from django.conf.urls import include, url

from django.contrib import admin

 

urlpatterns = [

    url(r'^admin/', include(admin.site.urls)),

    url(r'^', include('booktest.urls')),

]

请求访问

视图和URLconf都定义好了,接下来在浏览器地址栏中输入网址:

http://127.0.0.1:8000/

模板:

创建模板

为应用booktest下的视图index创建模板index.html,目录结构如下图:

Test1/templtes/booktest/index.html

设置查找模板的路径:打开test1/settings.py文件,设置TEMPLATES的DIRS值

'DIRS': [os.path.join(BASE_DIR, 'templates')],

定义模板

打开templtes/booktest/index.html文件,定义代码如下:

    图书列表

{{title}}

{%for i in list%}

{{i}}

{%endfor%}

视图调用模板简写

视图调用模板都要执行以上三部分,于是Django提供了一个函数render封装了以上代码。 方法render包含3个参数:

· 第一个参数为request对象

· 第二个参数为模板文件路径

· 第三个参数为字典,表示向模板中传递的上下文数据

打开booktst/views.py文件,调用render的代码如下:

from django.shortcuts import render

 

def index(request):

    context={'title':'图书列表','list':range(10)}

    return render(request,'booktest/index.html',context)

其他补充信息

查看mysql数据库日志

查看mysql数据库日志可以查看对数据库的操作记录。 mysql日志文件默认没有产生,需要做如下配置:

sudo vi /etc/mysql/mysql.conf.d/mysqld.conf

 

68,69行前面的#去除,然后保存并使用如下命令重启mysql服务。

sudo service mysql restart

使用如下命令打开mysql日志文件。

sudo tail -f /var/log/mysql/mysql.log #可以实时查看数据库的日志内容

查询的两大特性

· 惰性执行:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用。

· 缓存:使用同一个查询集,第一次使用时会发生数据库的查询,然后把结果缓存下来,再次使用这个查询集时会使用缓存的数据。

查询集的缓存

每个查询集都包含一个缓存来最小化对数据库的访问。

在新建的查询集中,缓存为空,首次对查询集求值时,会发生数据库查询,django会将查询的结果存在查询集的缓存中,并返回请求的结果,接下来对查询集求值将重用缓存中的结果。

演示:运行项目shell。

python manage.py shell

情况一:如下是两个查询集,无法重用缓存,每次查询都会与数据库进行一次交互,增加了数据库的负载。

from booktest.models import BookInfo

[book.id for book in BookInfo.objects.all()]

[book.id for book in BookInfo.objects.all()]

情况二:经过存储后,可以重用查询集,第二次使用缓存中的数据。

list=BookInfo.objects.all()

[book.id for book in list]

[book.id for book in list]

 

模型类关系

关系字段类型

关系型数据库的关系包括三种类型:

· ForeignKey:一对多,将字段定义在多的一端中。

· ManyToManyField:多对多,将字段定义在任意一端中。

· OneToOneField:一对一,将字段定义在任意一端中。

· 可以维护递归的关联关系,使用'self'指定,详见"自关联"。

关联查询

自关联地区信息模型

模型实例方法

· str():在将对象转换成字符串时会被调用。

· save():将模型对象保存到数据表中,ORM框架会转换成对应的insert或update语句。

· delete():将模型对象从数据表中删除,ORM框架会转换成对应的delete语句。

重定向

Cookie

Session

使用Redis存储Session

会话还支持文件、纯cookie、Memcached、Redis等方式存储,下面演示使用redis存储。

1)安装包。

pip install django-redis-sessions==0.5.6

2)修改test3/settings文件,增加如下项:

SESSION_ENGINE = 'redis_sessions.session'

SESSION_REDIS_HOST = 'localhost'

SESSION_REDIS_PORT = 6379

SESSION_REDIS_DB = 2

SESSION_REDIS_PASSWORD = ''

SESSION_REDIS_PREFIX = 'session'

3)打开booktest/views.py文件,修改session_test视图如下:

def session_test(request):

    request.session['h1']='hello'

    # h1=request.session.get('h1')

    # del request.session['h1']

    # request.session.flush()

    return HttpResponse('ok')

4)管理redis的命令,需要保证redis服务被开启。

查看:ps ajx|grep redis

启动:sudo service redis start

停止:sudo service redis stop

使用客户端连接服务器:redis-cli

切换数据库:select 2

查看所有的键:keys *

获取指定键的值:get name

模板的继承

验证码

手动实现验证码

接下来的代码不要求手动写出来,因为这种代码在网上可以搜到很多。

1)安装包Pillow3.4.1。

pip install Pillow==3.4.1

 

主要知识点如下:

· 静态文件处理

· 中间件

· 上传图片

· Admin站点

· 分页

· 示例:省市区选择,jquery,ajax

静态文件

项目中的CSS、图片、js都是静态文件。一般会将静态文件放到一个单独的目录中,以方便管理。在html页面中调用时,也需要指定静态文件的路径,Django中提供了一种解析的方式配置静态文件路径。静态文件可以放在项目根目录下,也可以放在应用的目录下,由于有些静态文件在项目中是通用的,所以推荐放在项目的根目录下,方便管理。

示例

1)在test5/settings.py文件中定义静态文件存放的物理目录。

STATIC_URL = '/static/'

STATICFILES_DIRS = [

    os.path.join(BASE_DIR, 'static'),

]

2)在项目根目录下创建static目录,再创建img、css、js目录。

中间件

Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性,其它的MVC框架也有这个功能,名称为IoC。

Admin站点

内容发布的部分由网站的管理员负责查看、添加、修改、删除数据,开发这些重复的功能是一件单调乏味、缺乏创造力的工作,为此,Django能够根据定义的模型类自动地生成管理模块。

1)准备工作:创建管理员的用户名和密码。

python manage.py createsuperuser

按提示填写用户名、邮箱、密码。

2)使用:在应用的admin.py中注册模型类

例:打开booktest/admin.py文件,注册地区模型。

from django.contrib import admin

from booktest.models import *

 

admin.site.register(AreaInfo)

3)输入如下网址:

http://127.0.0.1:8000/admin/

按提示填写用户名、密码,点击“Log in”按钮登录。

控制管理页展示

ModelAdmin可以控制模型在Admin界面中的展示方式,主要包括在列表页的展示方式、添加修改页的展示方式。

分页管理

重写模板

1)在templates/目录下创建admin目录,结构如下图:

 

2)打开当前虚拟环境中Django的目录,再向下找到admin的模板,目录如下:

/home/python/.virtualenvs/py_django/lib/python3.5/site-packages/django/contrib/admin/templates/admin

3)将需要更改文件拷贝到第一步建好的目录里,此处以base_site.html为例。

 

编辑base_site.html文件:

{% extends "admin/base.html" %}

 

{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}

 

{% block branding %}

{{ site_header|default:_('Django administration') }}


自定义的管理页模板


{% endblock %}

 

{% block nav-global %}{% endblock %}

上传图片

python中进行图片操作,需要安装包PIL。

pip install Pillow==3.4.1

Django中上传图片包括两种方式:

· 在管理页面admin中上传图片

· 自定义form表单中上传图片

上传图片后,将图片存储在服务器上,然后将图片的路径存储在表中。

布署

当项目开发完成后,需要将代码放到服务器上,这个过程称为布署,服务器上需要有一个运行代码的环境,这个环境一般使用uWSGI+Nginx。

 

第三方

本次课程中主要介绍一些常用的第三方Django模块,包括:

· 富文本编辑器

· 全文检索

· 邮件发送

· celery

· 布署

富文本编辑器

借助富文本编辑器,网站的编辑人员能够像使用offfice一样编写出漂亮的、所见即所得的页面。此处以tinymce为例,其它富文本编辑器的使用也是类似的。

在虚拟环境中安装包。

pip install django-tinymce==2.6.0

安装完成后,可以使用在Admin管理中,也可以自定义表单使用。

全文检索

全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理。

· haystack:全文检索的框架,支持whoosh、solr、Xapian、Elasticsearc四种全文检索引擎,点击查看官方网站

· whoosh:纯Python编写的全文搜索引擎,虽然性能比不上sphinx、xapian、Elasticsearc等,但是无二进制包,程序不会莫名其妙的崩溃,对于小型的站点,whoosh已经足够使用,点击查看whoosh文档

· jieba:一款免费的中文分词包,如果觉得不好用可以使用一些收费产品。

1)在虚拟环境中依次安装需要的包。

pip install django-haystack

pip install whoosh

pip install jieba

2)修改test6/settings.py文件,安装应用haystack。

3)在test6/settings.py文件中配置搜索引擎。

4)在test6/urls.py中添加搜索的配置。

创建引擎及索引

发送邮件

Django中内置了邮件发送功能,被定义在django.core.mail模块中。发送邮件需要使用SMTP服务器,常用的免费服务器有:163126QQ,下面以163邮件为例。

 

Celery

celery名词:

· 任务task:就是一个Python函数。

· 队列queue:将需要执行的任务加入到队列中。

· 工人worker:在一个新进程中,负责执行队列中的任务。

· 代理人broker:负责调度,在布置环境中使用redis。

安装包:

celery==3.1.25

django-celery==3.1.17

布署

当项目开发完成后,需要将项目代码放到服务器上,这个服务器拥有固定的IP,再通过域名绑定,就可以供其它人浏览,对于python web开发,可以使用wsgi、apache服务器,此处以wsgi为例进行布署。

服务器首先是物理上的一台性能高、线路全、运行稳定的机器,分为私有服务器、公有服务器。

· 私有服务器:公司自己购买、自己维护,只布署自己的应用,可供公司内部或外网访问,成本高,需要专业人员维护,适合大公司使用。

· 公有服务器:集成好运营环境,销售空间或主机,供其布署自己的应用,适合初创公司使用,成本低。

常用的公有服务器,如阿里云、青云等,可按流量收费或按时间收费。服务器还需要安装服务器软件,此处需要uWSGI、Nginx。

搭建服务器虚拟环境

1)在本机进入虚拟环境,执行命令导出当前需要的所有包。

pip freeze > plist.txt

2)通过ftp软件将项目代码和plist.txt文件上传到服务器。

3)创建虚拟环境,在虚拟环境上安装包。

mkvirtualenv 虚拟环境名称

pip install -r plist.txt

WSGI

在生产环境中使用WSGI作为python web的服务器。WSGI:全拼为Python Web Server Gateway Interface,Python Web服务器网关接口,是Python应用程序或框架和Web服务器之间的一种接口,被广泛接受。WSGI没有官方的实现, 因为WSGI更像一个协议,只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行。

项目默认会生成一个wsgi.py文件,确定了settings模块、application对象。

· application对象:在Python模块中使用application对象与应用服务器交互。

· settings模块:用于进行项目配置。

uWSGI

uWSGI实现了WSGI的所有接口,是一个快速、自我修复、开发人员和系统管理员友好的服务器。uWSGI代码完全用C编写,效率高、性能稳定。

Nginx

使用nginx的作用主要包括负载均衡、反向代理。

 

 

你可能感兴趣的:(Web后端)