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()
View Code

 

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()
View Code

 2. urls.py

1 from views import *
2 
3 urlpatterns = [
4     ("/login/", login),
5 ]
View Code

 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
View Code

 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>
View Code

 

启动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 ]
View Code

 

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})
View Code

 

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>
View Code

 

 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 ]
View Code

 

 

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项目
View Code
 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 ]
View Code

 

再刷新页面, 登录成功

 

 输入用户名及密码(忘了更改,略), 提交后会返回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',
]

 

 

posted @ 2019-11-04 18:05  Iceyine  阅读(174)  评论(0编辑  收藏  举报