定义数据模型


一、Django定义数据模型在App中的models.py文件,数据库的表名称以类的形式来定义:

[root@133web]#cd/opt/python/django/web/blog/[root@133blog]#vimmodels.pyfromdjango.dbimportmodels#Createyourmodelshere.classHost(models.Model):hostname=models.CharField(max_length=50)ip=models.IPAddressField()


二、查看模型的语法和逻辑是否正确:python manage.py validate , 0 errors 没有语法错误

[root@133blog]#cd/opt/python/django/web[root@133web]#lsblogdb.sqlite3manage.pyweb[root@133web]#pythonmanage.pyvalidate0errorsfound


三、管理数据库

初始化数据模型到数据库:python manage.py syncdb (默认使用的slqite数据库,在setting.py可以看到)

[root@133web]#cd/opt/python/django/web/web/[root@133web]#vimsettings.pyimportosBASE_DIR=os.path.dirname(os.path.dirname(__file__))#base_dir是seting.py的上级目录的上级目录:/opt/python/django/web/DATABASES={'default':{'ENGINE':'django.db.backends.sqlite3','NAME':os.path.join(BASE_DIR,'db.sqlite3'),}}前提是安装sqlite[root@133web]#cd/opt/python/django/web/[root@133web]#pythonmanage.pydbshellSQLiteversion3.6.20Enter".help"forinstructionsEnterSQLstatementsterminatedwitha";"sqlite>.tablessqlite>.exit#后台演示同步数据库的时候数据库的创建过程,[root@133web]#pythonmanage.pysqlallblogBEGIN;CREATETABLE"blog_host"("id"integerNOTNULLPRIMARYKEY,"hostname"varchar(50)NOTNULL,"ip"char(15)NOTNULL);COMMIT;#同步数据库,会创建表blog_host,创建管理用户[root@133web]#pythonmanage.pysyncdbCreatingtables...Creatingtabledjango_admin_logCreatingtableauth_permissionCreatingtableauth_group_permissionsCreatingtableauth_groupCreatingtableauth_user_groupsCreatingtableauth_user_user_permissionsCreatingtableauth_userCreatingtabledjango_content_typeCreatingtabledjango_sessionCreatingtableblog_hostYoujustinstalledDjango'sauthsystem,whichmeansyoudon'thaveanysuperusersdefined.Wouldyouliketocreateonenow?(yes/no):yesUsername(leaveblanktouse'root'):root#创建管理用户Emailaddress:david-dai@zamplus.com#输入管理用户的邮箱Password:#输入管理用户的密码Password(again):Superusercreatedsuccessfully.InstallingcustomSQL...Installingindexes...Installed0object(s)from0fixture(s)[root@133web]#ll总用量48drwxr-xr-x3rootroot40961月309:50blog-rw-r--r--1rootroot348161月310:12db.sqlite3#大小不为0-rwxr-xr-x1rootroot2461月123:11manage.pydrwxr-xr-x2rootroot40961月310:02web


查看数据库


方法一:通过admin的页面查看数据库

1、启动django

[root@133web]#nohuppythonmanage.pyrunserver11.65.140.13:8080&

2、在chrome浏览器中访问:输入用户名root和密码,默认是看不到数据库,需要把表注册到admin.py中,admin才能识别

[root@133blog]#cd/opt/python/django/web/blog/[root@133blog]#vimadmin.pyfromdjango.contribimportadminfromblog.modelsimportHost#加载app应用models#Registeryourmodelshere.classHostAdmin(admin.ModelAdmin):list_display=['hostname','ip']#固定属性,类似表中的字段admin.site.register(Host,HostAdmin)#注册两个表,刷新网页,多了一个host列,点击增加一个host,输入主机名和IP,点击保存,多了一个主机,可以查看

方法二:命令行方式登录查看数据库

[root@133blog]#cd/opt/python/django/web/[root@133web]#ll总用量52drwxr-xr-x3rootroot40961月310:28blog-rw-r--r--1rootroot348161月310:32db.sqlite3-rwxr-xr-x1rootroot2461月123:11manage.py-rw-------1rootroot21251月310:37nohup.outdrwxr-xr-x2rootroot40961月310:02web[root@133web]#sqlite3db.sqlite3SQLiteversion3.6.20Enter".help"forinstructionsEnterSQLstatementsterminatedwitha";"sqlite>.tablesauth_groupauth_user_user_permissionsauth_group_permissionsblog_hostauth_permissiondjango_admin_logauth_userdjango_content_typeauth_user_groupsdjango_sessionsqlite>select*fromblog_host;1|132|112.65.140.132sqlite>.exit[root@133web]#pythonmanage.pydbshellsqlite>.tablesauth_groupauth_user_user_permissionsauth_group_permissionsblog_hostauth_permissiondjango_admin_logauth_userdjango_content_typeauth_user_groupsdjango_sessionsqlite>select*fromblog_host;1|132|112.65.140.132


访问数据库(一)

1、命令行的交互式方法(类似ipython登陆):

#命令行交互式登录[root@133web]#pythonmanage.pyshell/opt/amos/python2.7/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py:58:RuntimeWarning:SQLitereceivedanaivedatetime(2017-01-0315:11:34.737126)whiletimezonesupportisactive.RuntimeWarning)Python2.7.3(default,Jan12017,21:43:50)Type"copyright","credits"or"license"formoreinformation.IPython5.1.0--AnenhancedInteractivePython.?->IntroductionandoverviewofIPython'sfeatures.%quickref->Quickreference.help->Python'sownhelpsystem.object?->Detailsabout'object',use'object??'forextradetails.In[1]:importsysIn[2]:sys.pathOut[2]:['','/opt/python/django/web',#项目的路径/opt/python/django/web成为环境变量…………#导入表In[3]:fromblog.modelsimportHost#blog包中的modes.py文件,倒入类class:HostIn[5]:Host.objects.all()Out[5]:[<Host:Hostobject>]#返回是一个列表[],每个元素是一个class#显示数据In[6]:nodes=Host.objects.all()In[7]:nodes.values()#查看表中的内容Out[7]:[{'ip':u'112.65.140.132','hostname':u'132',u'id':1}]#增加数据添加一个hostIn[8]:Host(hostname='node02',ip='192.168.1.2')Out[8]:<Host:Hostobject>In[9]:n=Host(hostname='node02',ip='192.168.1.2')#实例化一个对象In[10]:n.save()#保存nIn[11]:nodes=Host.objects.all()In[12]:nodes.values()Out[12]:[{'ip':u'112.65.140.132','hostname':u'132',u'id':1},{'ip':u'192.168.1.2','hostname':u'node02',u'id':2}]另一种方法添加一个hostIn[13]:n=Host()In[18]:n.hostname='node03'In[19]:n.ip='192.168.1.3'In[20]:n.save()#写入表In[21]:nodes=Host.objects.all()In[22]:nodes.values()Out[22]:[{'ip':u'112.65.140.132','hostname':u'132',u'id':1},{'ip':u'192.168.1.2','hostname':u'node02',u'id':2},{'ip':u'192.168.1.3','hostname':u'node03',u'id':3}]浏览器查看多了一个node03In[23]:n1=nodes[0]In[24]:n1.hostnameOut[24]:u'132'In[25]:n1.ipOut[25]:u'112.65.140.132'In[26]:n1.ip='192.168.1.1'#直接修改n1的ip值In[29]:n1.save()浏览器刷新可以看到主机132的ip已经变为192.168.1.1In[3]:fromblog.modelsimportHostIn[4]:nodes=Host.objects.all()In[5]:nodes.values()Out[5]:[{'ip':u'192.168.1.1','hostname':u'132',u'id':1},{'ip':u'192.168.1.2','hostname':u'node02',u'id':2},{'ip':u'192.168.1.3','hostname':u'node03',u'id':3}]In[6]:foriinnodes:printi.hostname132node02node03In[7]:foriinnodes:printi.hostname,i.ip132192.168.1.1node02192.168.1.2node03192.168.1.3


2、访问数据库二

通过视图文件views.py来访问数据

1、在urls.py文件里定义urls访问路径

[root@133web]#cd/opt/python/django/web/web[root@133web]#vimurls.pyfromdjango.conf.urlsimportpatterns,include,urlfromdjango.contribimportadminadmin.autodiscover()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'),#增加url配置文件)

2、在views.py里定义访问方法

[root@133web]#cd/opt/python/django/web/blog/[root@133blog]#vimviews.pyfromdjango.shortcutsimportrenderfromdjango.httpimportHttpResponsefromdjango.templateimportloader,Contextfromblog.modelsimportHost#从blog.models导入Host#Createyourviewshere.defindex(request):t=loader.get_template('index.html')c=Context({})returnHttpResponse(t.render(c))defdb(req):h=Host()h.hostname='nodes04'h.ip='192.168.1.4'h.save()returnHttpResponse('OK')


网页访问:http://11.65.140.13:8080/db/ 返回ok

注意:

request或者req是形式参数,形参可以随便定义,不是非得叫request或者req,可以叫abc。



访问数据库(三)/数据库传递post和get

定义API

1、urls.py

2、views.py定义访问方法(API)

[root@133blog]#vimviews.pyfromdjango.shortcutsimportrenderfromdjango.httpimportHttpResponsefromdjango.templateimportloader,Contextfromblog.modelsimportHost#Createyourviewshere.defindex(request):t=loader.get_template('index.html')c=Context({})returnHttpResponse(t.render(c))defdb(req):h=Host()h.hostname='nodes04'h.ip='192.168.1.4'h.save()returnHttpResponse('OK')#添加collect方法defcollect(request):#ifrequest.method=='POST':ifrequest.POST:hostname=request.POST.get('hostname')ip=request.POST.get('ip')host=Host()host.hostname=hostnamehost.ip=iphost.save()returnHttpResponse('OK,OK')else:returnHttpResponse('notdata')#修改collect转发规则[root@133web]#cd/opt/python/django/web/web/[root@133web]#vimurls.pyfromdjango.conf.urlsimportpatterns,include,urlfromdjango.contribimportadminadmin.autodiscover()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'),url(r'^collect/$','blog.views.collect'),#增加collect转发规则)浏览器访问:http://11.65.140.13:8080/collect/返回:notdata需要修改setting文件,注释中间件,才能使用curl传数据,否则django不识别[root@133web]#vimsettings.py#'django.middleware.csrf.CsrfViewMiddleware',#使用-d参数post方法传hostname和ip[root@133blog]#curl-dhostname='node05'-dip='192.168.1.5'http://112.65.140.133:8080/collect/OK,OK服务器端会用get方法提取hostname和ip,然后保存。可以查看到node05


通过get方法,先修改配置,然后通过浏览器传递。get方法是明文的,不是很安全

[root@133blog]#vimviews.pyfromdjango.shortcutsimportrenderfromdjango.httpimportHttpResponsefromdjango.templateimportloader,Contextfromblog.modelsimportHost#Createyourviewshere.defindex(request):t=loader.get_template('index.html')c=Context({})returnHttpResponse(t.render(c))defdb(req):h=Host()h.hostname='nodes04'h.ip='192.168.1.4'h.save()returnHttpResponse('OK')defcollect(request):#ifrequest.method=='POST':ifrequest.POST:hostname=request.POST.get('hostname')ip=request.POST.get('ip')host=Host()host.hostname=hostnamehost.ip=iphost.save()returnHttpResponse('OK,OK')elif:request.method=='GET':#定义get方法hostname=request.GET.get('hostname')ip=request.GET.get('ip')host=Host()host.hostname=hostnamehost.ip=iphost.save()returnHttpResponse('OK...')else:returnHttpResponse('notdata')

浏览器访问,指定hostname=node07,ip=192.168.1.7:

http://11.65.140.13:8080/collect/?hostname=node07&ip=192.168.1.7

返回:OK...


http://11.65.140.13:8080/admin/blog/host/

发现host07已经存在,使用浏览器的get方法传数据成功,明文,数据量小