文章出處

Python第十三天   django 1.6   導入模板   定義數據模型   訪問數據庫   GET和POST方法    SimpleCMDB項目   urllib模塊   urllib2模塊  httplib模塊  django和web服務器整合  wsgi模塊   gunicorn模塊

 

 

目錄

Pycharm使用技巧(轉載)

Python第一天 安裝 shell 文件

Python第二天 變量 運算符與表達式 input()與raw_input()區別 字符編碼

Python第三天 序列 數據類型 數值 字符串 列表 元組 字典

Python第四天 流程控制 ifelse條件判斷 forwhile循環

Python第五天 文件訪問 for循環訪問文件 while循環訪問文件 字符串的startswith函數和split函數

Python第六天 類型轉換

Python第七天 函數 函數參數 函數變量 函數返回值 多類型傳值 冗余參數 函數遞歸調用 匿名函數 內置函數 列表表達式/列表重寫

Python第八天 模塊 包 全局變量和內置變量__name__ Python path

Python第九天 面向對象 類定義 類的屬性 類的方法 內部類 垃圾回收機制 類的繼承

Python第十天 print >> f,和fd.write()的區別 stdout的buffer 標準輸入 標準輸出 標準錯誤 重定向

Python第十一天 異常處理 glob模塊和shlex模塊 打開外部程序和subprocess模塊 subprocess類 Pipe管道 operator模塊 sorted函數 生成器 walk模塊 hashlib模塊

Python第十二天   收集主機信息   正則表達式   正則表達式  無名分組   有名分組

Python第十三天   django 1.6   導入模板   定義數據模型   訪問數據庫   GET和POST方法    SimpleCMDB項目   urllib模塊   urllib2模塊  httplib模塊  django和web服務器整合  wsgi模塊   gunicorn模塊

Python第十四天 序列化  pickle模塊  cPickle模塊  JSON模塊  API的兩種格式

 

 

 

 

前端模板:(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.py
V: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 list

2、源碼安裝方式
下載tar.gz包
django的源碼包
https://pypi.python.org/pypi/Django
python setup.py install
中文文檔:
http://djangobook.py3k.cn/2.0/


# 驗證django版本
import django
print(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 web
settings.py當前工程的配置文件
urls.py:urls配置文件,MVC里面的C
__init__.py 說明當前是一個包,python可以引入這個目錄下的模塊

 

# 修改時區和語言
vim settings.py
TIME_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 12
drwxr-xr-x 2 root root 4096 Feb 11 21:00 blog
-rwxr-xr-x 1 root root  246 Feb 11 10:56 manage.py
drwxr-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.py

from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse('<h1>hello django</h1>')

# Create your views here.


訪問:http://192.168.10.2:8880/blog/index

 

 

 


 

 

導入模板
cd /data/www/web
mkdir blog/templates
templates:名字不能改

cd blog/templates
vim index.html
<h1> hello </h1>

cd /data/www/web/blog/
vim views.py
修改視圖文件views.py
from django.template import loader, Context
1. 創建模板對象,把對應的模板文件導入,自動在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 HttpResponse
from 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_permissions
auth_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.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}

執行python manage.py syncdb之后會生成db.sqlite3文件
[root@VM_centos web]# ll
total 48
drwxr-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.py
drwxr-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/blog
vim vim admin.py
把表在admin.py里注冊,admin才能識別

from django.contrib import admin
from 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 shell
from 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.py
urlpatterns = 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.py
from django.template import loader,Context
from blog.models import Host
from django.shortcuts import render
from django.http import HttpResponse

def 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 = hostname
host.ipaddr = ipaddr
host.save()
return HttpResponse('OK')
else:
return HttpResponse('not data')


注釋掉csrf,讓django識別curl
vim settings.py
MIDDLEWARE_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方法

HttpRequest
request.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.py
from hostinfo.models import Host
class 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)
req = urllib2.urlopen('http://192.168.131.10:8000/api/collect/',d)
req.read()


vim models.py
from 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.hostname

class HostGroup(models.Model):
groupname = models.CharField(max_length=50)
members = models.ManyToManyField(Host)


創建HostGroup表,models.py
class HostGroup(models.Model):
groupname = models.CharField(max_length=50)
members = models.ManyToManyField(Host) # 多對多關系

注冊數據庫,admin.py
from hostinfo.models import HostGroup
class 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_wsgi

cd /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,名為books

python manage.py validate
驗證Django數據模型代碼是否有錯誤,models.py文件里面的代碼是否有誤

python manage.py sqlall books
為模型產生sql代碼,但不實際執行

python manage.py syncdb
運行sql語句,在數據庫里創建模型相應的Table

python manage.py dbshell
啟動數據庫的命令行工具

 

 


 

sqlite常用操作

 

跟mysql一樣,以分號 ; 作為一個語句的結束

sqlite> .tables
auth_group                  auth_user_user_permissions
auth_group_permissions      blog_host                 
auth_permission             django_admin_log          
auth_user                   django_content_type       
auth_user_groups            django_session            

sqlite> .database
seq  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: list
nullvalue: ""
   output: stdout
separator: "|"
    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 <table> code
                         insert   SQL insert statements for TABLE
                         line     One value per line
                         list     Values delimited by .separator string
                         tabs     Tab-separated values
                         tcl      TCL list elements
.nullvalue STRING      Print STRING in place of NULL values
.output FILENAME       Send output to FILENAME
.output stdout         Send output to the screen
.prompt MAIN CONTINUE  Replace the standard prompts
.quit                  Exit this program
.read FILENAME         Execute SQL in FILENAME
.restore ?DB? FILE     Restore content of DB (default "main") from FILE
.schema ?TABLE?        Show the CREATE statements
                         If TABLE specified, only show tables matching
                         LIKE pattern TABLE.
.separator STRING      Change separator used by output mode and .import
.show                  Show the current values for various settings
.tables ?TABLE?        List names of tables
                         If TABLE specified, only list tables matching
                         LIKE pattern TABLE.
.timeout MS            Try opening locked tables for MS milliseconds
.width NUM NUM ...     Set column widths for "column" mode
.timer ON|OFF          Turn the CPU timer measurement on or off

 


 

django中的模型三種關系

 

1=>N | 1<=>1 | N<=>N 三種關系

1對多:ForeignKey
1對1:OneToOneField
多對多:ManyToManyField

class 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/


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 AutoPoster 的頭像
    AutoPoster

    互聯網 - 大數據

    AutoPoster 發表在 痞客邦 留言(0) 人氣()