Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块
目录
翻译项目
http://python.usyiyi.cn/translate/django_182/index.html
前端模板:(SmartAdmin)http://www.cnblogs.com/smartbooks/archive/2012/12/03/2799416.html
现在主流使用django 1.6
https://docs.djangoproject.com/en/1.7/faq/install/
MVC
M:models.pyV:templates 和views.py C:urls.py
Django
Django的安装https://docs.djangoproject.com/en/1.6/1、pip 安装方式
pip install django==1.6.5或easy_install django查看是否安装成功
pip list2、源码安装方式
下载tar.gz包django的源码包https://pypi.python.org/pypi/Djangopython setup.py install中文文档:http://djangobook.py3k.cn/2.0/ # 验证django版本import djangoprint(django.get_version())1.5.5
django-admin.py
/usr/bin/django-admin.py/usr/lib/python2.6/site-packages/django/bin/django-admin.py
创建工程
首先创建一个工程目录:
cd /data/www/#web为项目名,在当前目录下会新建一个web目录django-admin.py startproject websettings.py当前工程的配置文件urls.py:urls配置文件,MVC里面的C__init__.py 说明当前是一个包,python可以引入这个目录下的模块
# 修改时区和语言
vim settings.pyTIME_ZONE = 'Asia/Shanghai'LANGUAGE_CODE = 'zh-cn'cat /etc/sysconfig/clock
ZONE="Asia/Shanghai"启动服务:
cd /data/www/web/
python manage.py runserver 0.0.0.0:8880
django目录结构项目-》应用
项目文件夹里面可以包含多个应用,跟visual studio里面的解决方案下面有多个application一样,最好只创建一个应用,因为一个应用对应一个数据库
添加应用
添加一个应用,记住,应用一定要创建在项目文件夹下cd /data/www/web/
python manage.py startapp blog或者:django-admin.py startapp blog
[root@VM_centos web]# ll
total 12drwxr-xr-x 2 root root 4096 Feb 11 21:00 blog-rwxr-xr-x 1 root root 246 Feb 11 10:56 manage.pydrwxr-xr-x 2 root root 4096 Feb 11 11:14 web在项目文件夹里的setting.py
cd /data/www/web/1. 添加应用:setting.py
INSTALLED_APPS = ('blog',2.修改url配置文件urls.py:用户请求的url转给谁去处理url(r'^blog/index/$', 'blog.views.index'),blog:blog目录views:blog目录下的views.py index:写在views.py 里面的index函数3.修改应用视图文件:让views.py文件的index方法来处理此请求:
cd /data/www/web/blog/vim views.pyfrom django.shortcuts import renderfrom django.http import HttpResponsedef index(request): return HttpResponse('hello django
')# Create your views here.
导入模板
cd /data/www/webmkdir blog/templatestemplates:名字不能改cd blog/templates
vim index.html<h1> hello </h1>cd /data/www/web/blog/
vim views.py修改视图文件views.pyfrom django.template import loader, Context1. 创建模板对象,把对应的模板文件导入,自动在templates目录下找到index.html文件loader.get_template('index.html') 2. 生成Context对象, 空的字典c = Context({})3. return HttpResponse(t.render(c))from django.shortcuts import render
from django.http import HttpResponsefrom django.template import loader, Context# Create your views here.
def index(request):
t = loader.get_template('index.html') c = Context({}) return HttpResponse(t.render(c))
定义数据模型Django定义数据模型在App中的models.py文件,数据库的表名称以类的形式来定义:vim models.py
from django.db import models# Create your models here.class Host(models.Model): hostname = models.CharField(max_length=50) ipaddr = models.IPAddressField()def __unicode__(self): return self.hostname
python manage.py validate //查看models.py的语法和逻辑是否正确,返回0 errors found正确 管理数据
python manage.py validate
初始化模型到数据库,每个应用对应一个数据库,每个数据库都有下面的权限表:sqlite> .tables
auth_group auth_user_user_permissionsauth_group_permissions blog_host auth_permission django_admin_log auth_user django_content_type auth_user_groups django_session python manage.py syncdb执行的时候会提示输入django管理界面的用户名和密码(也就是django自带的管理平台的用户名和密码http://192.168.6.3:8880/admin,这个用户名密码会保存到auth_user表里)打开django管理界面
http://192.168.10.2:8880/admin确保数据库引擎已经设置好
vim settings.pyDATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }}执行python manage.py syncdb之后会生成db.sqlite3文件
[root@VM_centos web]# lltotal 48drwxr-xr-x 2 root root 4096 Feb 13 13:55 blog-rw-r--r-- 1 root root 34816 Feb 13 14:04 db.sqlite3-rwxr-xr-x 1 root root 246 Feb 11 10:56 manage.pydrwxr-xr-x 2 root root 4096 Feb 13 14:01 web
换数据库
https://docs.djangoproject.com/en/1.10/ref/settings/
DATABASES = {
'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'cmdb', 'USER': 'root', 'PASSWORD': '123456', 'HOST': '127.0.0.1', 'PORT': '3306', }}需要安装python的mysql驱动
yum install -y MySQL-python.x86_64
通过admin页面管理数据:
cd /data/www/web/blogvim vim admin.py把表在admin.py里注册,admin才能识别from django.contrib import adminfrom blog.models import Host或from blog.models import * 导入所有的类# Register your models here.如果要显示列,需要定义list_display列表:class HostAdmin(admin.ModelAdmin): list_display = ['hostname','ipaddr']admin.site.register(Host, HostAdmin)
访问数据库
访问数据库(一)
如何访问数据,交互式方法:
python manage.py shellfrom blog.models import Host //导入表显示数据: node = Host.objects.all()node.values()增加数据:n1 = Host(hostname=‘node1',ipaddr=‘1.1.1.1')或:n1 = Host()n1.hostname = ‘node1’n1.ipaddr = ‘1.1.1.1’n1.save() //写到表里 访问数据库(二)通过视图文件views.py来访问数据
1.在urls.py文件里定义urls访问路径vim urls.pyurlpatterns = patterns('', # Examples: # url(r'^$', 'web.views.home', name='home'), # url(r'^blog/', include('blog.urls')),url(r'^admin/', include(admin.site.urls)),
url(r'^blog/index/$', 'blog.views.index'), url(r'^db/$', 'blog.views.db'),) 2. 在views.py里定义访问方法vim views.pyfrom django.template import loader,Contextfrom blog.models import Hostfrom django.shortcuts import renderfrom django.http import HttpResponsedef index(request):
return HttpResponse('<h1>hello django</h1>')def db(req):
h=Host() h.hostname='test' h.ip='192.168.2.3' h.save() return HttpResponse('OK')
request,req:表示客户端向服务器端的请求,HttpRequest对象
访问数据库(三)定义API
1. urls.py 定义访问路径2. views.py 定义访问方法 (API)def collect(request):if request.POST: 或 request.method == 'POST'hostname = request.POST.get('hostname')ipaddr = request.POST.get('ipaddr')host = Host()host.hostname = hostnamehost.ipaddr = ipaddrhost.save()return HttpResponse('OK')else:return HttpResponse('not data') 注释掉csrf,让django识别curlvim settings.pyMIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',)curl -d hostname='node05' -d ip='192.168.10.2' http://192.168.1.5:8000/db/
GET和POST方法
HttpRequestrequest.POST.get('hostname')或:request.POST['hostname']request.GET.get('hostname')
或:request.GET['hostname'] 传递数据POST方法:curl -d hostname='node12' -d ipaddr='12.12.12.12' http://192.168.3.72:8000/blog.collect/GET方法:通过浏览器传递数据
http://192.168.3.72:8000/blog.get?hostname=n3&ipaddr=1.1.1.3
SimpleCMDB项目 urllib模块 urllib2模块 httplib模块
创建一个应用:
python manage.py startapp hostinfo修改settings.py添加应用
admin.py注册数据库:admin.pyfrom hostinfo.models import Hostclass HostAdmin(admin.ModelAdmin): list_display = ['hostname', 'vendor', 'product', 'osver', 'cpu_model', 'cpu_num', 'memory', 'sn']admin.site.register(Host, HostAdmin)
syncdb同步数据库定义url访问路径views.py定义访问方法
导入数据:
# cat data.sh curl -d vendor='HP' -d product='2014' -d osver='rhel6.4' -d memory=4 -d cpu_model='Intel' -d cpu_num=8 -d sn='XXXXX' -d hostname='node2' http://192.168.131.10:8000/api/collect/# bash data.sh
urllib,urllib2,httplib
使用urllib访问网页和传数据,通常urllib,urllib2这两个模块一起添加req = urllib2.urlopen('http://192.168.131.10:8000/api/collect')对字典data进行编码,生成post格式的数据data ={'hostname':'node05','ip':'192.18.2.3'}d = urllib.urlencode(data) #必须先要urlencode 才能传入urlreq = urllib2.urlopen('http://192.168.131.10:8000/api/collect/',d)req.read()
urlopen(url, data=None, timeout=<object object>, cafile=None, capath=None, cadefault=False, context=None)
data=None:请求的数据,post方式 urlencode(query, doseq=0)Encode a sequence of two-element tuples or dictionary into a URL query string.传入一个两个元素的元组或字典作为url查询字符串print urllib.urlencode({'ip':'192.168.1.1','host':'123'})ip=192.168.1.1&host=123 : 转化为url的post方式vim models.pyfrom django.db import models
# Create your models here.
class Host(models.Model):
hostname = models.CharField(max_length=50) ip = models.IPAddressField() vendor = models.CharField(max_length=50) product = models.CharField(max_length=50) sn = models.CharField(max_length=50) cpu_model = models.CharField(max_length=50) cpu_num = models.IntegerField() memory = models.CharField(max_length=50) osver = models.CharField(max_length=50)def __unicode__(self):
return self.hostnameclass HostGroup(models.Model):
groupname = models.CharField(max_length=50) members = models.ManyToManyField(Host)创建HostGroup表,models.pyclass HostGroup(models.Model): groupname = models.CharField(max_length=50) members = models.ManyToManyField(Host) # 多对多关系注册数据库,admin.py from hostinfo.models import HostGroupclass HostGroupAdmin(admin.ModelAdmin): list_display = ['groupname']admin.site.register(HostGroup, HostGroupAdmin)
python manage.py sqlall blog
BEGIN;
CREATE TABLE "blog_host" ( "id" integer NOT NULL PRIMARY KEY, "hostname" varchar(50) NOT NULL, "ip" char(15) NOT NULL, "vendor" varchar(50) NOT NULL, "product" varchar(50) NOT NULL, "sn" varchar(50) NOT NULL, "cpu_model" varchar(50) NOT NULL, "cpu_num" integer NOT NULL, "memory" varchar(50) NOT NULL, "osver" varchar(50) NOT NULL);CREATE TABLE "blog_hostgroup_members" ( "id" integer NOT NULL PRIMARY KEY, "hostgroup_id" integer NOT NULL, "host_id" integer NOT NULL REFERENCES "blog_host" ("id"), UNIQUE ("hostgroup_id", "host_id"));CREATE TABLE "blog_hostgroup" ( "id" integer NOT NULL PRIMARY KEY, "groupname" varchar(50) NOT NULL);CREATE INDEX "blog_hostgroup_members_521bb4b0" ON "blog_hostgroup_members" ("hostgroup_id");CREATE INDEX "blog_hostgroup_members_27f00f5d" ON "blog_hostgroup_members" ("host_id");COMMIT;
django和web服务器整合 wsgi模块 gunicorn模块
wsgi模块
wsgi:web server gateway interface web服务器网关接口
Django与Apache整合 安装yum install -y mod_wsgicd /etc/httpd/conf.d
vim wsgi.conf
gunicorn模块
yum install -y epel-release
Django与nginx整合
netstat -tulanp|grep :8000
使用这个命令来看8000端口是否开启,192.168.0.110上的8000是nginx开的,127.0.0.1上的8000是python这个进程开的。所以使用netstat -tulanp|grep nginx这个命令是看不到的。
manage.py的用法
python manage.py runserver 8080更改服务器端口号python manage.py shell启动交互界面,如果系统安装了ipython则启动ipython,否则启动python命令行,而且多了一些环境变量python manage.py startapp books创建一个app,名为bookspython manage.py validate验证Django数据模型代码是否有错误,models.py文件里面的代码是否有误python manage.py sqlall books为模型产生sql代码,但不实际执行python manage.py syncdb运行sql语句,在数据库里创建模型相应的Tablepython manage.py dbshell启动数据库的命令行工具
sqlite常用操作
跟mysql一样,以分号 ; 作为一个语句的结束
sqlite> .tablesauth_group auth_user_user_permissionsauth_group_permissions blog_host auth_permission django_admin_log auth_user django_content_type auth_user_groups django_session sqlite> .databaseseq name file --- --------------- ----------------------------------------------------------0 main /data/www/web/db.sqlite3 1 temp sqlite> .exit [root@VM_centos web]# sqlite> .schema CREATE TABLE "auth_group" ( "id" integer NOT NULL PRIMARY KEY, "name" varchar(80) NOT NULL UNIQUE);CREATE INDEX "django_admin_log_6340c63c" ON "django_admin_log" ("user_id");CREATE INDEX "django_session_b7b81f0c" ON "django_session" ("expire_date");sqlite> .show echo: off explain: off headers: off mode: listnullvalue: "" output: stdoutseparator: "|" width: sqlite> .help .backup ?DB? FILE Backup DB (default "main") to FILE.bail ON|OFF Stop after hitting an error. Default OFF.databases List names and files of attached databases.dump ?TABLE? ... Dump the database in an SQL text format If TABLE specified, only dump tables matching LIKE pattern TABLE..echo ON|OFF Turn command echo on or off.exit Exit this program.explain ON|OFF Turn output mode suitable for EXPLAIN on or off..genfkey ?OPTIONS? Options are: --no-drop: Do not drop old fkey triggers. --ignore-errors: Ignore tables with fkey errors --exec: Execute generated SQL immediately See file tool/genfkey.README in the source distribution for further information..header(s) ON|OFF Turn display of headers on or off.help Show this message.import FILE TABLE Import data from FILE into TABLE.indices ?TABLE? Show names of all indices If TABLE specified, only show indices for tables matching LIKE pattern TABLE..load FILE ?ENTRY? Load an extension library.mode MODE ?TABLE? Set output mode where MODE is one of: csv Comma-separated values column Left-aligned columns. (See .width) html HTML
django中的模型三种关系
1=>N | 1<=>1 | N<=>N 三种关系
1对多:ForeignKey
1对1:OneToOneField多对多:ManyToManyFieldclass Student(models.Model):
student_name = models.CharField(verbose_name=u'student name', max_length=100) school = models.ForeignKey(School, on_delete=models.CASCADE, verbose_name='student school') teachers = models.ManyToManyField(Teacher, verbose_name='students teachers') bed = models.OneToOneField(Bed, on_delete=models.CASCADE, verbose_name='student bed')
django女孩博客
http://blog.djangogirls.org/