django学习__1

打印 上一主题 下一主题

主题 867|帖子 867|积分 2603

Django

python网络编程回顾

之前我们介绍过web应用程序和http协议,简单了解过web开发的概念。Web应用程序的本质

  • 接收并解析HTTP请求,获取具体的请求信息
  • 处理本次HTTP请求,即完成本次请求的业务逻辑处理
  • 构造并返回处理结果——HTTP响应
  1. import socket
  2. server = socket.socket()
  3. server.bind(('127.0.0.1',8000))
  4. server.listen(5)
  5. while True:
  6.     conn,addr = server.accept()
  7.     data = conn.recv(1024)
  8.     print("data:\n", data)
复制代码
即一般我们接受到的数据就是一串网络报文
那么我们可以根据返回的一些内容进行路径的解析
  1. request_path = data.decode('utf-8').split('\r\n')[0].split(' ')[1]
  2. if request_path == '/':
  3.     with open("index.html", "rb") as f:
  4.         data = f.read()
  5.     conn.send(b'HTTP/1.1 200 OK\r\n\r\n' + data)
  6. elif request_path == '/timer':
  7.     with open("login.html", "rb") as f:
  8.         data = f.read()
  9.     conn.send(b'HTTP/1.1 200 OK\r\n\r\n' + data)
  10. else:
  11.     with open("notFound.html", "rb") as f:
  12.         data = f.read()
  13.     conn.send(b'HTTP/1.1 404 Not Found\r\n\r\n' + data)
复制代码
每次的分发路由会有很多个,依次罗列会非常麻烦,所以进入一个web框架的概念
Web应用框架有助于减轻网页开发时共通性活动的工作负荷,例如许多框架提供数据库访问接口、标准样板以及会话管理等,可提升代码的可再用性。
说简单点就是web框架用于搭建Web应用程序,免去不同Web应用相同代码部分的重复。
Django介绍


Django文档
Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。
这个MVT模式并非django首创,在其他的语言里面也有类似的设计模式MVC,甚至可以说django里面的MVT事实上是借鉴了MVC模式衍生出来的。
M,Model,模型,是用于完成操作数据库的。
V,View,视图,里面的代码就是用于展示给客户端的页面效果。
C,Controller,控制器,是一个类或者函数,里面的代码就是用于项目功能逻辑的,一般用于调用模型来获取数据,获取到的数据通过调用视图文件返回给客户端。
而MVT指的是:

  • M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。
  • V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。
  • T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。
路由控制器将请求转发给对应的视图函数,完成业务逻辑,视图函数将从model中获取的数据嵌入到template的中模板文件(html)渲染成一个页面字符串,返回给客户端的流程。
所以学习Django重点是四个部分:url路由器+MVT
Django的安装

官网: http://www.djangoproject.com
文档:https://docs.djangoproject.com/zh-hans/3.2/
在本地安装
  1. pip install django
  2. pip install django==3.2
复制代码
  1. pip源:
  2.     https://pypi.douban.com/simple/  豆瓣源
  3.     https://pypi.tuna.tsinghua.edu.cn/simple   清华源
  4.         
  5. 使用格式:
  6.     pip install django -i https://pypi.douban.com/simple/
复制代码
  1. # 查看django版本号
  2. django-admin --version
复制代码
当然在以后开发或者学习中,我们肯定都会遇到在一台开发机子中,运行多个项目的情况,有时候还会出现每个项目的python解析器或者依赖包的版本有差异.

Django的启动和运行

创建好了虚拟环境可以直接运用命令建立一个django文件,命令有下面这些
  1. ivanlee@ivanleedeMacBook-Pro ~ % django-admin
  2. Type 'django-admin help <subcommand>' for help on a specific subcommand.
  3. Available subcommands:
  4. [django]
  5.     check
  6.     compilemessages
  7.     createcachetable
  8.     dbshell
  9.     diffsettings
  10.     dumpdata
  11.     flush
  12.     inspectdb
  13.     loaddata
  14.     makemessages
  15.     makemigrations
  16.     migrate
  17.     runserver
  18.     sendtestemail
  19.     shell
  20.     showmigrations
  21.     sqlflush
  22.     sqlmigrate
  23.     sqlsequencereset
  24.     squashmigrations
  25.     startapp
  26.     startproject
  27.     test
  28.     testserver
复制代码
使用startproject可以新建一个项目

建立好项目以后,他会自带的形成很多的目录文件框架
  1. ivanlee@ivanleedeMacBook-Pro Desktop % tree Regina
  2. Regina
  3. ├── Regina
  4. │   ├── __init__.py
  5. │   ├── asgi.py
  6. │   ├── settings.py
  7. │   ├── urls.py
  8. │   └── wsgi.py
  9. └── manage.py
  10. 1 directory, 6 files
复制代码
通过命令行python3 manage.py runserver ip_port就可以直接启动,在网页上访问8090端口会显示一个静态模板网页


在项目中创建应用

创建子应用

pytho3 manage.py startapp appName
  1. ivanlee@ivanleedeMacBook-Pro Regina % tree
  2. .
  3. ├── Regina
  4. │   ├── __init__.py
  5. │   ├── asgi.py        django3.0以后新增的,用于让django运行在异步编程模式的一个web应用对象
  6. │   ├── settings.py    默认开发配置文件
  7. │   ├── urls.py        路由列表目录,用于绑定视图和url的映射关系
  8. │   └── wsgi.py        wsgi就是项目运行在wsgi服务器时的入口文件,runserver默认启动的wsgi.py文件作为web服务器接口
  9. ├── Reginaapp                  子应用
  10. │   ├── __init__.py
  11. │   ├── admin.py               该应用的后台管理系统配置
  12. │   ├── apps.py                该应用的一些配置,自动生成
  13. │   ├── models.py              该应用的模型类模块
  14. │   ├── tests.py               该应用的单元测试模块
  15. │   └── views.py               该应用的视图模块
  16. ├── db.sqlite3
  17. └── manage.py          终端脚本命令,提供了一系列用于生成文件或者目录的命令,也叫脚手架
  18. 4 directories, 18 files
复制代码
当然如果每次运行项目都要在终端下输入命令的话,很麻烦,这时候我们可以借助pycharm直接自动运行这段命令.当然,这个需要我们在pycharm配置一下的.

找到这个默认参数的位置,如果里面是空的,那么在运行manage.py的时候会自动报停,因为后面没有任何的命令参数



快速使用Django

在django中要提供数据展示给用户,我们需要完成3个步骤.
需求:利用Django实现一个查看当前时间的web页面。
基于MTV模型,设计步骤如下:

  • step1:在urls.py中设计url与视图的映射关系。
  • step2:创建子应用,在views.py中构建视图函数。
  • step3:将变量嵌入到模板中返回客户端。
1. 创建子应用


2. 绑定路由

在djangoRegina.urls.py的文件里会自带一个默认的路由
  1. from django.contrib import admin
  2. from django.urls import path
  3. urlpatterns = [
  4.     path('admin/', admin.site.urls),
  5. ]
复制代码
如果这个文件不被修改的话,访问8090端口的时候默认就会显示一个静态页面,但如果手动添加了其他代码和路由进来的话,那么默认路由也会失效


那在自己编写路由的时候,可以分为以下两种情况
直接在urls文件里添加函数
  1. from django.contrib import admin
  2. from django.urls import path
  3. from django.shortcuts import HttpResponse  所有的网络报文必须都是同一种格式,所以导入这个模块方便了我们信息交换
  4. def get_ZJR(request):    这个函数叫做视图函数
  5.     return HttpResponse("<img src='https://www.cnblogs.com/xxxx.jpeg'>")   返回一个已经封装好的报文
  6. urlpatterns = [
  7.     path('admin/', admin.site.urls),
  8.     path('ZJR/', get_ZJR),
  9. ]
复制代码

将试图函数集成在一个视图文件里

3. 构建视图函数

因为如果过多的视图函数都堆积在路由区域,代码会非常的复杂,所以可以归类到一个文件当中:ReginaApp.views.py
  1. from django.shortcuts import render, HttpResponse
  2. # Create your views here.
  3. def get_ZJR(request):
  4.     return HttpResponse("<img src='https://images.cnblogs.com/cnblogs_com/blogs/751189/galleries/2161669/o_220713040648_WechatIMG275.jpeg'>")
  5. def get_name(request):
  6.     return HttpResponse("hello Ms JiaRui")
复制代码
再在djangoRegina.urls.py里进行导入
  1. from django.contrib import admin
  2. from django.urls import path
  3. from django.shortcuts import HttpResponse
  4. from ReginaApp import views
  5. urlpatterns = [
  6.     path('admin/', admin.site.urls),
  7.     path('ZJR/', views.get_ZJR),
  8.     path('name/', views.get_name),  这里的路由视图函数一定不加括号
  9. ]
复制代码

4. 构建模板

本身在与项目同名的子文件下的setting.py里,会有一个配置模板文件的目录

首先检查这个地方是否填充了目录,一般来说是自己带着的,之后在manage.py的同根目录下建立一个templates文件夹,里面虽然存放的都是html文件,但在django里叫做模板文件
  1. def get_ZJR(request):
  2.     return render(request,"regina.html")
复制代码
这样再导入的时候,就会去找templates/regina.html

5. 渲染文件
  1. def get_ZJR(request):
  2.     now = datetime.datetime.now().strftime("%Y-%m-%d %X")
  3.     return render(request,"regina.html",{"now":now})
复制代码
将要动态渲染的内容以字典的形式附加在函数末尾,在模板文件里被渲染的部分用{{}}引用
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Title</title>
  6.    
  7. </head>
  8. <body>
  9. <h3>IvanleeZJR {{now}}</h3>
  10. <img  src="https://images.cnblogs.com/cnblogs_com/blogs/751189/galleries/2161669/o_220713040648_WechatIMG275.jpeg" alt="">
  11. </body>
  12. </html>
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表