目录css
众所周知,全部的Web应用基本都是基于B/S结构,其本质上其实就是一个socket服务端(web服务器),一个socket客户端(用户浏览器)。下面的代码就是一个简单的web端,运行后,使用浏览器访问,会打印hello worldhtml
#!/usr/bin/env python #_*_coding:utf-8_*_ import socket def handle_request(client): buf = client.recv(1024) client.send(b"HTTP/1.1 200 OK\r\n\r\n") client.send(b"Hello, world") def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost',8000)) sock.listen(5) while True: connection, address = sock.accept() handle_request(connection) connection.close() if __name__ == '__main__': main()
上述代码经过socket实现了web服务端的本质,而对于真实开发中的Python Web程序来讲,通常会分为两部分:服务器程序和应用程序。前端
为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不一样的框架有不一样的开发方式,可是不管如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。这样,服务器程序就须要为不一样的框架提供不一样的支持。这样混乱的局面不管对于服务器仍是框架,都是很差的。对服务器来讲,须要支持各类不一样框架,对框架来讲,只有支持它的服务器才能被开发出的应用使用。这时候,标准化就变得尤其重要。咱们能够设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就能够配合使用。一旦标准肯定,双方各自实现。这样,服务器能够支持更多支持标准的框架,框架也可使用更多支持标准的服务器。python
WSGI全称为:The Python Web Server Gateway Interface,单从名字来看就是一种网关,而网关的做用就是在协议之间进行转换。
WSGI是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口,是一种规范,定义了使用Python编写的Web app与Web server之间接口格式,实现web app与web server间的解耦。mysql
Python标准库提供的独立WSGI服务器称为wsgiref。nginx
# 利用wsgiref完成上面简单的web服务程序 from wsgiref.simple_server import make_server def RunServer(environ, start_response): # environ 存放的是用户访问时提交的信息,包涵http header等 start_response('200 OK', [('Content-Type', 'text/html')]) # 构建http response头部信息 return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ] # 返回给用户的信息,注意是 bytes 格式。 if __name__ == '__main__': httpd = make_server('', 8000, RunServer) # 启动一个服务,监听8000端口,请求进来交给RunServer函数处理 print("Serving HTTP on port 8000...") httpd.serve_forever() # 启动服务开始接受请求
说到web开发,就须要遵循必定的开发模式。著名的MVC/MTV模式,其本质是使各组件之间保持松耦合关系。web
MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计建立 Web 应用程序的模式正则表达式
MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的彻底控制。sql
MTV是一种使用MTV(Model Templates Views 模型-模版-视图)设计建立 Web 应用程序的模式数据库
此外,Django还有一个url分发器,它的做用是将一个个URL的页面请求分发给不一样的view处理,view再调用相应的Model和Template,逻辑处理以下:
MVC即模型-视图-控制器模式,就是为那些须要为一样的数据提供多个视图的应用程序而设计的。它很好地实现了数据层与表示层的分离,特别适用于开发与用户图形界面有关的应用程序。控制器用来处理用户命令以及程序事件;模型维护数据并提供数据访问方法;视图用于数据的显示。
MTV即模型-模版-视图模式,其标准名称是有争议的。在MVC的解释中,视图描述了展示给用户的数据,是指所看到的数据,而不是如何看见它。在python中视图是指对某一特定URL的回调函数,由于回调函数描述了所要展示的数据。模版用于将内容与展示分离。在django中,视图描述了要展示的数据,而视图通常转交给模版。模版描述了数据如何展示。控制器则是指django框架自己,经过URL配置,系统将一个请求发送到一个合适的视图。
Django是重量级选手中最有表明性的一位。许多成功的网站和APP都基于Django。是一个开放源代码的Web应用框架,由Python写成。遵照BSD版权,初次发布于2005年7月, 并于2008年9月发布了第一个正式版本1.0 。
本次选择djang 1.11.20 版本,进行学习
Django是标准的MTV框架。
下面使用django建立服务端站点,并显示hello world页面信息。
使用命令行执行以下命令进行安装
pip3 install Django==1.11.20
注意:会安装在python安装目录的scripts目录下。针对多环境的状况下,使用哪一个解释器安装,那么就会安装在哪一个版本下。安装完毕后会在scripts下产生一个django-admin.py文件,利用该文件能够在命令行下建立一个Django项目。
django-admin.py startproject PEOJECTNAME
建立完毕后:会产生PROJECTNAME命名的文件夹,里面包含 PROJECTNAME 目录 和 manager.py文件。
其中:
python manage.py startapp APPNAME
为何一个项目里要建立一个应用?举个例子:微信是一个项目,那么通信录,钱包,朋友圈就是一个个相互独立功能,这里叫作应用。一个项目是全部应用的集合。
建立一个应用以后会产生同名目录,目录下的主要文件功能以下:
views.py 中的函数:必定是来根据用户输入的内容来返回一个具体的页面,wsgi模块用来负责HTTP协议的解析,而后放在views视图函数中,做为一个固定的参数(request)使用。
python manage.py runserver PORT
启动一个web应用服务,并监听8800端口,这样就启动了一个django项目了,但这是咱们测试时的启动方式,生产上不会这么用。
下面来实现一个站点,当咱们访问时,输出hello world信息
定义url选择器是为了能在用户输入url的时候把对应的url映射到指定的views函数中去处理,因此urls.py会存放在项目全局的目录下。
# urls.py文件 from blog import views # blog为项目名,导入views模块 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$',views.index), # 就能够表示首页 ]
url的参数:
通过项目的urls控制,那么请求将会分配给具体的应用(函数)来处理,因此须要在应用的目录中的views.py文件中进行添加。因为咱们返回的是静态页面,不须要进行数据库相关的处理,因此在index函数内,能够直接返回页面给客户端。
这里有两种方式:
返回html标签:
# blog/models.py from django.shortcuts import HttpResponse def index(request): return HttpResponse('<h1>hello world</h1>')<br> # 注意:用户的请求经由wsgi处理后,会返回一个对象标识,通常这里使用request来接受这个对象。 # HttpResponse 用户对客户的相应
返回html文件:
全部的html文件是由Templates来进行处理的,因此须要如今Templates目录下建立要返回的html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>hello world</h1> </body> </html>
对应的models.py修改成
from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') # render,的第一个参数就是request,标识把后面的index文件返回给这个request
答复的html文件,render会去Templates下寻找,由于在setting.py文件中已经定义了Templates的路径
在项目目录下执行
python manage.py runserver 8080
启动完毕后,使用浏览器访问。
http://127.0.0.1:8080
为了使咱们的项目依赖的文件放在特定的地方提供访问,那么咱们在建立完项目还须要作一些基础的配置。
静态文件:好比css,js文件都是要提供给用户进行下载的,因此咱们通常规定静态文件,存放在django项目的一级子目录static中,须要手动建立这个目录,而后作以下配置。
# 修改settings.py文件 STATICFILES_DIRS = ( os.path.join(BASE_DIR,'static'), # 添加静态文件路径 )
用来集中存放用于返回给用户的模板文件(若是是利用pycharm建立的项目,它会自动帮咱们建立template目录,并自动进行关联),建立templates目录(一样存放在django项目的一级子目录下)。
# 修改settings.py文件 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] # 添加templates文件的路径 , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
csrftoken用于防止csrf攻击,csrf的相关配置将在后面进行说明,因此这里能够先关闭csrftoken。
# 修改settings.py文件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', # 注释掉csrf中间件便可(须要重启django项目) 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
django支持MySQL 5.5+ 官方建议使用mysqlclient 1.3.7+ 来驱动,因此这里须要先安装
pip install myclient
web站点最重要的数据库链接配置,须要在settings.py中设置所链接的数据库。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 引擎 'NAME': 'blog', # 库名 'USER': 'dahl', # 数据库用户名 'PASSWORD': '123456', # 数据库密码 'HOST': '127.0.0.1', # 数据库地址 'PORT': '3306', # 数据库端口 } }
支持的数据库引擎有:
'django.db.backends.postgresql' 'django.db.backends.mysql' 'django.db.backends.sqlite3' 'django.db.backends.oracle'
更多的配置方法参考:https://docs.djangoproject.com/en/1.11/ref/settings/#databases
若是安装mysqlclient失败,提示缺乏C++,那么不建议安装全部的编译环境,由于即使是安装因此,可能没法编译成功,因此能够在一下网站中直接查找现成的whl包。https://www.lfd.uci.edu/~gohlke/pythonlibs/
Django 提供了基于 web 的管理工具即django-admin,它能够经过web页面来管理咱们项目中的表,但前提是你已经把表注册给admin管辖了。
默认状况下,django-admin是随django一块儿安装的,要使用它,还须要通过如下步骤:
在项目根目录下执行
python manage.py createsuperuser
按照提示建立django-admin的管理用户
django-admin须要一些表来处理admin后台的登陆、认证等信息,因此咱们须要在数据库中把这些表建立。django的自带的orm能够帮咱们完成这项操做,若是你的项目须要建立表,那么请首先确保项目的配置文件settings.py中的INSTALLAPP列表中包含你的应用名称
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'user' # 这个就是咱们的应用名称,注意它的路径是从项目的顶级目录开始的 ]
项目本身的models中须要自行编写数据库表的映射类,django-admin的映射类已经内置。
执行以下命令生成迁移文件
python manage.py makemigrations
执行完毕后,会在项目目录下生成migrations目录,里面存放的是因此的迁移记录,不要随意删除。
执行以下命令完成表迁移(在数据库中建立)
python manage.py migrate
当咱们对models.py中的映射类结构进行修改时,那么每次都须要进行上述两步操做
注意:
默认状况下django-admin的后台管理是英文的,能够在settings.py文件中修改成中文显示
# LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'zh-Hans' # TIME_ZONE = 'UTC' TIME_ZONE = 'Asia/Shanghai'
若是想要django-admin管理项目本身的表信息,那么须要将表注册给django-admin,那么就须要在应用目录下的admin.py中进行以下操做
from django.contrib import admin from user.models import User # 导入models.py中要被管理的类 # Register your models here. admin.site.register(User) # 注册给amdin
附User表:(models.py中)
class User(models.Model): class Meta: db_table = 'user' id = models.AutoField(primary_key=True) name = models.CharField(max_length=48, null=False) email = models.CharField(max_length=64, unique=True, null=False) password = models.CharField(max_length=128, null=False) def __repr__(self): return '<User {} {}>'.format(self.id, self.name)
这时,从新启动django,那么就能够访问admin了。(项目根目录下)
python manage.py runserver 8080
在浏览器中输入127.0.0.1:8080/admim 输入刚刚建立的superuser便可。