02 引入Django
1. 一个简单的web应用程序
1 import socket 2 # 创建socket对象 3 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 4 # 绑定IP和端口 5 sock.bind(("127.0.0.1", 9999)) 6 # 监听 7 sock.listen(5) 8 9 while True: 10 conn,addr = sock.accept() # 等待连接 11 data = conn.recv(1024) # 接收数据 12 print("请求信息=====> %s" % data) 13 # 发送数据 14 conn.send("HTTP/1.1 200 OK\r\nContent-Type: text/html;charset=utf-8\r\n\r\n".encode("utf-8")) 15 conn.send("<h2>骑士计划</h2>".encode("utf-8")) 16 conn.close()
2. Web框架
Web框架(Web framework)是一种开发框架, 用来支持动态网站, 网络应用和网络服务的开发。浏览器和服务器之间是基于HTTP协议进行通信的,也可以说web框架就是在以上十几行代码基础上扩展出来的,有很多简单方便使用的方法,打打提高了开发的效率。
DIY一个web框架(如图)
1. 启动文件manage.py
1 from wsgiref.simple_server import make_server 2 from urls import * 3 4 5 def application(environ, start_response): 6 start_response('200 OK', [('Content-Type', 'text/html;charset=utf-8')]) 7 path = environ.get("PATH_INFO") 8 func = None 9 for item in urlpatterns: 10 if path == item[0]: 11 func = item[1] 12 break 13 if func: 14 ret = func(environ) 15 else: 16 ret = not_found(environ) 17 18 return [ret] 19 20 21 if __name__ == '__main__': 22 httpd = make_server('', 8080, application) 23 print('Serving HTTP on port 8080...') 24 # 开始监听HTTP请求: 25 httpd.serve_forever()
2. urls.py
1 from views import * 2 3 urlpatterns = [ 4 ("/login/", login), 5 ]
3. views.py
1 def login(environ): 2 with open("templates/login.html", "rb") as f: 3 data = f.read() 4 return data 5 6 7 def not_found(environ): 8 ret = b'<h1>404 not found.!!!</h1>' 9 return ret
4. templates模板目录(该目录下的login.html)
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <form action="http://127.0.0.1:8080/login/" method="post"> 9 <p>用户名:<input type="text" name="user"></p> 10 <p>密码:<input type="password" name="pwd"></p> 11 <input type="submit"> 12 </form> 13 </body> 14 </html>
启动manage.py, 从templates/login.html访问网页, 填写内容后, 查看manage.py下输出的内容:
3. Django简介
MVC与MTV模型
MVC模型
Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,
他们之间以一种插件式的、松耦合的方式连接在一起,
模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,
其示意图如下所示:
MTV模型
Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是指:
M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
T 代表模板 (Template):负责如何把页面展示给用户(html)。
V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。
除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,
View再调用相应的Model和Template,MTV的响应模式如下所示:
一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
4. Django下载与基本命令
4.1 Django下载
windows下载地址: https://www.djangoproject.com/download/
pip install django==2.2.6 #下载指定版本(不加==后面的版本,默认下载最新版本)
一般要以管理员身份运行cmd使用pip命令安装django
拓展: 使用pycharm安装, 操作如图
django发布的版本及年限图:
4.2 创建一个Django项目
django-admin startproject mysite #创建一个项目名为mysite的django项目
拓展: 使用pycharm创建一个django项目(原始命令行创建的django项目, 需要额外创建templates和app路径, 并在settings中注册)
4.3 命令行创建的Django项目目录介绍
1 |---mysite # 项目的根目录 2 |---mysite # 项目目录 3 |---__init__.py 4 |---settings.py # 配置文件 5 |---urls.py # 路由系统 ===> url与视图的对应关系 6 |---wsgi.py # runserver命令就使用wsgiref模块做简单的web server 7 |---manage.py # 管理文件
4.4 在django项目中命令行创建应用
1 python manage.py startapp app01 # 在项目目录下, 创建名为app01的应用 2 INSTALLED_APPS = [..., 'app01.apps.App01Config', ...] # 在settings.py中的INSTALLED_APPS列表中, 添加注册应用
认识app目录结构
4.5 启动运行Django项目
1 # 在manage.py同级目录运行命令 2 python manage.py runserver # 127.0.0.1:8000, 默认是8000端口 3 python manage.py runserver 80 # 127.0.0.1:80, 可以指定端口号启动 4 python manage.py runserver 0.0.0.0:8888 # 0.0.0.0:8888 , 指定服务器和端口
5. 基于Django实现一个简单示例
5.1 mysite\mysite\urls.py添加代码
1 """mysite URL Configuration 2 3 The `urlpatterns` list routes URLs to views. For more information please see: 4 https://docs.djangoproject.com/en/2.2/topics/http/urls/ 5 Examples: 6 Function views 7 1. Add an import: from my_app import views 8 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 Class-based views 10 1. Add an import: from other_app.views import Home 11 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 Including another URLconf 13 1. Import the include() function: from django.urls import include, path 14 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 """ 16 from django.contrib import admin 17 from django.urls import path 18 from app01 import views 19 20 urlpatterns = [ 21 path('admin/', admin.site.urls), 22 path('timer/', views.timer), 23 ]
5.2 mysite\app01\views.py添加代码
1 from django.shortcuts import render 2 3 # Create your views here. 4 5 def timer(request): 6 import datetime 7 now_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") 8 return render(request, "timer.html", {"now_time": now_time})
5.3 创建mysite\templates\timer.html(创建了templates模板路径后需要在settings文件中注册)
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>test timer</title> 6 </head> 7 <body> 8 9 <h3>当前时间为:{{ now_time }}</h3> 10 11 </body> 12 </html>
1 # 在settings.py文件中注册'DIRS': [os.path.join(BASE_DIR, 'templates')], 2 3 TEMPLATES = [ 4 { 5 'BACKEND': 'django.template.backends.django.DjangoTemplates', 6 'DIRS': [os.path.join(BASE_DIR, 'templates')], 7 'APP_DIRS': True, 8 'OPTIONS': { 9 'context_processors': [ 10 'django.template.context_processors.debug', 11 'django.template.context_processors.request', 12 'django.contrib.auth.context_processors.auth', 13 'django.contrib.messages.context_processors.messages', 14 ], 15 }, 16 }, 17 ]
5.4 浏览器访问http://127.0.0.1:800/timer报错(是因为没有在settings中注册templates路径)
5.5 正常访问路径http://127.0.0.1:8000/timer/ , 返回页面如下
6. 使用django制作一个登录页面
6.1 创建django项目启动并写相关路由(urls),视图(views)和模板(templates)文件
1 django-admin startproject mysite2 # 创建名为mysite2的django项目 2 cd mysite2 #进入django项目根目录 3 python manage.py startapp login01 # 创建名为login01的app应用 4 5 # 在settings.py配置文件中注册app并指定templates路径 6 # Application definition 7 8 INSTALLED_APPS = [ 9 'django.contrib.admin', 10 'django.contrib.auth', 11 'django.contrib.contenttypes', 12 'django.contrib.sessions', 13 'django.contrib.messages', 14 'django.contrib.staticfiles', 15 'login01.apps.Login01Config', # 增加这句 16 ] 17 18 19 TEMPLATES = [ 20 { 21 'BACKEND': 'django.template.backends.django.DjangoTemplates', 22 'DIRS': [os.path.join(BASE_DIR,'templates')], #修改添加内容 23 'APP_DIRS': True, 24 'OPTIONS': { 25 'context_processors': [ 26 'django.template.context_processors.debug', 27 'django.template.context_processors.request', 28 'django.contrib.auth.context_processors.auth', 29 'django.contrib.messages.context_processors.messages', 30 ], 31 }, 32 }, 33 ] 34 35 36 python manage.py runserver # 启动django项目
1 # mysite2\mysite2\urls.py 添加登录路径及视图函数 2 3 from django.contrib import admin 4 from django.urls import path 5 from login01 import views 6 7 urlpatterns = [ 8 path('admin/', admin.site.urls), 9 path('login/', views.login01), 10 ]
1 # mysite2\login01\views.py 撰写视图函数 2 from django.shortcuts import render, HttpResponse, redirect # 导入html中的请求三剑客render, HttpResponse, redirect 3 from django.urls import reverse 4 5 # Create your views here. 6 7 def login01(request): 8 if request.method == "GET": 9 return render(request, "login.html") 10 else: 11 username = request.POST.get('username') 12 password = request.POST.get('password') 13 print(username, password) 14 15 return HttpResponse("OKOK")
1 # mysite2\templates\login.html 新增登录页面 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <title>login</title> 7 </head> 8 <body> 9 <h3>用户登录</h3> 10 <form action="" method="post"> # action中不填写值, 默认为当前urls.py中的path路径 11 <p>用户名: <input type="text" name="username"></p> 12 <p>用户名: <input type="password" name="password"></p> 13 <input type="submit"> 14 15 </form> 16 17 </body> 18 </html>
views.py文件中request.POST.get中的值必须和login.html中的name的值保持一致
6.2 登录页面http://127.0.0.1:8000/login/
1 MIDDLEWARE = [ 2 'django.middleware.security.SecurityMiddleware', 3 'django.contrib.sessions.middleware.SessionMiddleware', 4 'django.middleware.common.CommonMiddleware', 5 # 'django.middleware.csrf.CsrfViewMiddleware', #注释掉 6 'django.contrib.auth.middleware.AuthenticationMiddleware', 7 'django.contrib.messages.middleware.MessageMiddleware', 8 'django.middleware.clickjacking.XFrameOptionsMiddleware', 9 ]
再刷新页面, 登录成功
输入用户名及密码(忘了更改,略), 提交后会返回OKOK页面
6.3 完善业务逻辑
1 # mysite2\login01\views.py 新增判断用户密码, 如果用户密码不正确,返回登录页面 2 3 from django.shortcuts import render, HttpResponse, redirect 4 from django.urls import reverse 5 6 # Create your views here. 7 8 def login01(request): 9 if request.method == "GET": 10 return render(request, "login.html") 11 else: 12 username = request.POST.get('username') 13 password = request.POST.get('password') 14 print(username, password) 15 if username == "yinyan" and password == "123456": 16 return HttpResponse("登录成功") 17 return redirect("/login/")
7. 静态文件的配置
STATIC_URL = '/static/' # HTML中使用的静态文件夹前缀 STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static"), # 静态文件存放位置,手工创建 ]
刚开始学习时可在配置文件中暂时禁用csrf中间件,方便表单提交测试。
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', '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', ]