Python

Django学习之路(9)——进一步了解Model工作原理

摘要:本文我们主要探讨下Model层在django是怎么工作的。1. makemigrations后面做了什么上一篇文章中我们说到创建好blog/models.py中的内容后,执行python manage.py makemigrations就会自动创建表结构,那么执行这个命令的背后,django框架又给我们做了什么呢?其实,在这个命令后面我们还可以接上app的名字,表示指定app来创建或更新表结构,这个对于一个项目有多个app来说特别有用,所以我们可以把命令变成:python manage.py makemigrations blog此时,我们会发现在blog目录中多了如下几个东东:此时会生成一个migrations的文件夹,有一个叫0001_initial.py的文件,这个文件的内容其实我们不要太关心,它只是记录你操作的过程,当我们继续修改Model层时,会生成0002,0003开头的文件。那么我们如何来看django给我们生成的sql语句呢?只需要执行以下语句即可:python manage.py sqlmigrate blog 0001其中,blog是app名称,0001表示0001_initial.py记录的操作过程,此时应该可以看到如下输出:BEGIN;CREATE TABLE `blog_userinfo` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `username` varchar(256) NOT NULL, `password` varchar(256) NOT NULL);COMMIT;其实这是django框架给我们全部做好了这个数据库与模型层的映射关系,即ORM。1.1 什么是ORM?ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。1.2 ORM有什么优缺点?优点:摆脱复杂的SQL操作,适应快速开发,让数据结构变得简洁;数据库迁移成本更低(如从mysql->oracle)缺点:性能较差、不适用于大型应用,复杂的SQL操作还需通过SQL语句实现。2. ORM的关系映射基本和数据库关键映射类似,即:一对一的关系一对多的关系多对多的关系这里我们先不讨论,以免加大了学习的难度,后面的文章中再继续学习。
阅读全文
Python

Django学习之路(8)——模型层初探

摘要:本节中我们将学会如何在django框架中使用mysql数据库,保存用户的注册信息,并将用户的注册信息展现在前端blog/register.html页面中。1. Ubuntu中安装mysqlsudo apt-get install mysql-server mysql-client #启动mysql sudo systemctl start mysql.service #给mysql的root用户创建密码123456 sudo mysqladmin -uroot password '123456' #登录mysql并创建blog数据库 sudo mysql -uroot -p123456 > create database blog; > quit2. 安装mysql驱动包pip install MySQL-pythonpython连接mysql数据库的库,当然这并不是唯一选择。3. 创建register URL为了使代码更加规范,我们将注册链接修改为/blog/register,当然index.html页面中的注册表单的action也要修改成action="/blog/register/"修改:/home/chin/PythonEnv/django_project/blog/urls.py修改:/home/chin/PythonEnv/django_project/blog/views.py增加文件:/home/chin/PythonEnv/django_project/blog/templates/blog/register.html至此,代码结构上整理完毕,来看下目录树:重启uwsgid后可以看到注册效果:4. 创建数据库模型1)修改项目配置文件:/home/chin/PythonEnv/django_project/django_project/settings.py2)修改文件:/home/chin/PythonEnv/django_project/blog/models.py3)自动创建数据表结构,执行如下两条命令:此时,我们可以看到数据库blog中自动生成了图中所示表:5. 在View层调用Models对象插入读取数据主要修改文件:/home/chin/PythonEnv/django_project/blog/views.py6. 麻雀虽小,五脏俱全重启uwsgid后,注册几个用户信息看看:如果我们去数据库中查看,会发现数据内容已经保存到表blog_userinfo中了,其中,blog是app名称,userinfo是models中的成员函数。7. 需要注意的事项如果你看了此文后,发现有些步骤结果可能不太一样,不要气馁,因为编程本来就是一个折腾的过程,不遇到问题怎么能增长贱识呢
阅读全文
Python

Django学习之路(7)——开始与前端页面交互

摘要:在这一节中我们将完成两个目标:1) 通过读取mysql数据库中的数据传递给前端页面来显示。2) 读取用户输入数据,并将用户数据展示在表格中。1. 向前端页面传递内容修改blog/view.py中的内容如下:修改templates/blog/index.html中的内容如下:重启下uwsgid restart,页面效果如下:说明正常传递值给页面显示了,接下来我们想要用户参数这个数据交互,写一个简单的表单用于数据提交。3. 用户提交内容暂时没有添加action和点击时的js检验,此时界面如下图:点击提交后,出现如下结果:这是因为django框架已经给我们做好跨站攻击安全性检测了,这里我们为了测试方便,先把CSRF检测关闭:重启uwsgid restart,此时再提交就不会出现403页面了。4. 提交用户输入内容并显示此时我们把表单的action给加上:<form method="post" action="/blog/register/">此时我们需要改两个urls.py文件,一个是项目目录中的urls.py,一个是app目录中的urls.py,内容分别如下:项目目录文件:/home/chin/PythonEnv/django_project/django_project/settings.pyapp目录中的urls.py文件:/home/chin/PythonEnv/django_project/blog/urls.py这里为了不把事情搞大,通过表单提交后的方法还是index页面,此时在index页面,即blog/view.py文件中需要添加如下内容:老规矩,重启uwsgid后再刷新页面,输入用户名密码分别为hello   world,效果如下图:此时发现表格中多了一行,至此,一个完整的表单展示用户数据就完成了。但有个问题,我们页面刷新后,数据还是原来了,为了将这个数据保存,我们需要将数据保存到数据库中,并在刷新页面时再显示出来,详情请见下文分解。
阅读全文
Python

Django学习之路(6)——开始写一个简单页面

摘要:本文面向:有python基础,刚接触web框架的初学者。环境:Ubuntu 16.10    python2.7.12   pycharm专业版   Django 1.87版  pip2.7本文前面三小节有抄袭嫌疑,是网友们确实描述的够精准,拿来也无妨。1. Django简介百度百科:开放源代码的Web应用框架,由Python语言编写blabla......  重点:一个大而全的框架,啥都替你考虑好了。  具体介绍Django之前,必须先介绍WEB框架等概念。  web框架: 别人已经设定好的一个web网站模板,你学习它的规则,然后“填空”或“修改”成你自己需要的样子。  一般web框架的架构是这样的:其它基于python的web框架,如tornado、flask、webpy都是在这个范围内进行增删裁剪的。例如tornado用的是自己的异步非阻塞“wsgi”,flask则只提供了最精简和基本的框架。Django则是直接使用了WSGI,并实现了大部分功能。2. MVC/MTV介绍MVC百度百科:全名Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。  通俗解释:一种文件的组织和管理形式!不要被缩写吓到了,这其实就是把不同类型的文件放到不同的目录下的一种方法,然后取了个高大上的名字。当然,它带来的好处有很多,比如前后端分离,松耦合等等,就不详细说明了。         模型(model):定义数据库相关的内容,一般放在models.py文件中。  视图(view):定义HTML等静态网页文件相关,也就是那些html、css、js等前端的东西。  控制器(controller):定义业务逻辑相关,就是你的主要代码。    MTV: 有些WEB框架觉得MVC的字面意思很别扭,就给它改了一下。view不再是HTML相关,而是主业务逻辑了,相当于控制器。html被放在Templates中,称作模板,于是MVC就变成了MTV。这其实就是一个文字游戏,和MVC本质上是一样的,换了个名字和叫法而已,换汤不换药。3. 标Django的MTV模型组织目录分开,就必须有机制将他们在内里进行耦合。在Django中,urls、orm、static、settings等起着重要的作用。一个典型的业务流程是如下图所示:4. 学习Django的什么?1. 目录结构规范2. urls路由方式3. settings配置4. ORM操作5. jinja2模板渲染6.其它5. 创建一个APP前面我们已经学过了如何用Nginx+uwsgi搭建django运行环境,现在我们进入到django的项目目录并建一个名为blog的APPcd ~/PythonEnv/django_project/ #创建APP django-admin.py startapp blog第一步:修改下django_project目录中urls.py的路由,即文件:/home/chin/PythonEnv/django_project/django_project/urls.py这里的意思是当浏览器直接以IP,未带任何参数访问时,默认访问的是blog中urls.py中写的路由地址第二步:我们接下来要在blog目录中写一个urls.py文件,内容如下:# coding:utf-8 from django.conf.urls import  url from . import views urlpatterns = <     url(r'^$', views.index,name='index'), >第三步:编辑/home/chin/PythonEnv/django_project/blog/views.py文件,内容如下:from django.shortcuts import render # Create your views here. def index(request):     return render(request, 'blog/index.html')由于在django中html是用jinja2语法编写的模板,它是有固定的目录要求的,框架规定所有的view层文件都放在templates目录中,这里我们写了一个前缀目录blog/,所以我们需要创建如下目录结构:(PythonEnv) chin@chin-PC:~/PythonEnv/django_project$ tree blog blog ├── admin.py ├── __init__.py ├── migrations │   └── __init__.py ├── models.py ├── templates │   └── blog │       └── index.html ├── tests.py ├── urls.py └── views.py至于这里我们为什么要创建blog前缀,是有原因的,因为django的遍历规则是找所有的APP下的templates模板下的html文件,也就是说如果是其它APP中(如有一个名为mysite的APP)调用index.html页面,而刚好blog作为第一个APP被遍历到了,就会直接用blog/templates/index.html页面了。这种做法有好处,也有不好的地方。好处就是其它APP可以很方便的跨APP调用公共页面,并继承该页面所有元素;不好的地方就是有时候排查问题起来比较费劲。所以我这里加上app的名字,目的就是为了保持view页面的独立性。接下来,我们还需要在index.html中搞点事,内容如下:<!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <title>Test</title> </head> <body> <p>欢迎来到果子的博客!</p> </body> </html>第四步:在项目中注册下app,修改下文件:/home/chin/PythonEnv/django_project/django_project/settings.py其中ALLOWED_HOSTS中可以指定可以访问的IP地址,我这里写的是'"'表示所有人都可以访问,如果你的nginx中配置了所有人可以访问WEB服务器,但这里没放开,也是不可以访问的哦,千万要注意!接着在INSTALLED_APPS中注册下APP,即blog。6. 重启uwsgi千万要记得重启uwsgi哦,前面我们已经写好了一个启动脚本,并放到了沙盒环境的bin目录下,我们只需要在沙盒环境中直接执行如下命令即可:uwsgid restart7. 开始访问在浏览器中输入:http://192.168.1.10/ 以下是效果图:
阅读全文
Python

Django学习之路(5)——开始集成uwsgi+nginx+django

前言:终于要步入正题了,是不是有点小激动呢,本文我将用两种环境记录下我折腾的过程。Django是一个高级python WEB开发框架,它倡导高效整洁的开发和简洁的设计理念。Nginx是一个免费开源、高性能的HTTP和反向代理服务,同时也是一个IMAP/POP3代理服务。本文并不是一篇详尽描述如何搭建一个生产环境的参考手册,因为具体的生产环境可能会有不同的配置,果子哥只是尽可能的描述一个生产环境应该是一个什么样的配置模式。此外,nginx和uwsgi对于django框架来说是一个不错的选择,但并不是唯一的选择(或者说是“官方”选择) 1.基本概念 一个WEB服务器——nginx,它是直接面向用户访问的,它能提供诸如静态网页,图片,css等的直接访问,然而并不能直接和django应用对话,包括我们之前所接触过的PHP,它也是把动态请求转发给php-fpm来解析,一定要牢记这一点:nginx是没有解析动态语言的能力的,它需要依赖别的模块来解析。本文将要使用的uwsgi就可以理解为django应用的解析器,所以完成一次django应用的行为如下: client <-> nginx <-> socket <-> uwsgi <-> django 其中,socket是nginx与uwsgi的通讯模块,它可以通过端口或者unix socket来进行数据交互。 2.创建一个沙盒 太棒了,我们的沙盒终于要出场了。接下来我要在/home/chin目录下创建一个沙盒,以普通用户chin登录shell终端,执行如下命令: cd ~ virtualenv PythonEnv cd PythonEnv # 临时添加环境变量 source bin/activate # 你应该会看到如下类似的提示符 # (PythonEnv) chin@chin-PC:~$  # 查看下pip和python的路径,你会发现它们都在沙盒路径中了 which pip python /home/chin/PythonEnv/bin/pip /home/chin/PythonEnv/bin/python 这一步也非常简单,该用上我们的pip工具啦,我们在沙盒中创建一个django项目并进入该项目目录: pip install django==1.8.17 django-admin.py startproject django_project cd django_project #查看下django目录 tree -L 2 ├── db.sqlite3 ├── django_project │   ├── __init__.py │   ├── settings.py │   ├── urls.py │   └── wsgi.py ├── manage.py ├── test.py 3.安装并使用uwsgi 有了pip工具,让我们如此得意,继续安装uwsgi pip install uwsgi 1) 测试一下 创建一个文件test.py,并加下以下内容: # test.py def application(env, start_response):     start_response('200 OK', )     #return  # python3     return  # python2 2) 运行uwsgi uwsgi --http :8080 --wsgi-file test.py 各选项的含义: http :8080 :使用http协议,端口号为8080 wsgi-file test.py:加载指定的文件test.py 此时可以在浏览器中访问:http://192.168.1.10:8080,效果如下: 该过程的交互如下: client < -> uwsgi < -> python 4.测试django项目 到现在为止,我们已经让uwsgi正常运行起来了,只是用test.py来模拟了django的行为,接下来我们将要使用django自带的web服务器来运行: 访问下效果图如下: 如果能看到上图,说明我们的django应用也正常部署了,接下来我们测试下用uwsgi能不能运行django应用: uwsgi --http :8080 --module django_project.wsgi 如果到这步你还没遇到任何问题的话,恭喜您,我们继续! 说明:此时的交互模式变成: client < -> uwsgi < -> django 安装nginx sudo apt-get install nginx sudo nginx -v # nginx version: nginx/1.10.0 (Ubuntu) sudo systemctl start nginx.service 此时,你用浏览器直接访问应该能看到"Welcome to nginx!"的字样,此时说明nginx已经正常运行,交互模式变成: client < -> web server (nginx) 1)...
阅读全文