Django框架(综合各方知识)

  • 介绍Django和设计模式
    • CGI方式开发web
    • MVC 设计模式
    • web各部分说明
  • 主要内容
    • 结构说明
    • 必要步骤
    • 简单体验留言板
    • 进阶留言板:css和html分离,最后在html引入css
      • 方式一,css放入app里(app独立性强时候选用)
      • 方式二,css放入主目录(全局配置时选用)
    • 进阶留言板:需求分析和表设计
      • 数据库工作
      • 自定义表
    • 进阶留言板:马上增删改查
      • 查询的三种方式
      • 后端代码执行数据插入
      • 前端表单提交
      • 后端提取数据在前端展示
    • template 简介

介绍Django和设计模式

  1. 以最小的代价构建和维护高质量的Web应用。
  2. 代码将会十分 清晰,易于维护。

CGI方式开发web

首先做一个Python脚本,输出HTML代码,然后保存成.cgi扩展名的文件,通过浏览器访问此文件。 就是这样。

#!/usr/bin/env python
import MySQLdb
print "Content‐Type: text/html\n"
print "<html><head><title>Books</title></head>"
print "<body>"
print "<h1>Books</h1>"
print "<ul>"
connection = MySQLdb.connect(user='me', passwd='letmein', db='my_db')
cursor = connection.cursor()
cursor.execute("SELECT name FROM books ORDER BY pub_date DESC LIMIT 10")
for row in cursor.fetchall():print "<li>%s</li>" % row[0]
print "</ul>"
print "</body></html>"

首先,用户请求CGI,脚本代码打印Content-Type行,后面跟着换行。
再接下 来是一些HTML的起始标签,然后连接数据库并执行一些查询操作,获取最新的十本书。
在遍历这些书的同时,生成一个书名的HTML列表项。
最后,输出HTML的结束标签并且关闭数据库连接。

MVC 设计模式

  1. models.py 文件主要用一个 Python 类来描述数据表。 称为 模型(model) 。 运用这个类,你可以通过简单的 Python 的代码来创建、检索、更新、删除 数据库中的记录而无需写一条又一条的SQL语句。
  2. views.py文件包含了页面的业务逻辑。 latest_books()函数叫做视图。
  3. urls.py 指出了什么样的 URL 调用什么的视图。 在这个例子中 /latest/ URL 将会调用 latest_books()这个函数。 换句话说,如果你的域名是example.com,任何人浏览网址http://example.com/latest/将会调用latest_books()这个函数。
  4. latest_books.html 是 html 模板,它描述了这个页面的设计是如何的。 使用带基本逻辑声明的模板语言,如{% for book in book_list %}

这些部分松散遵循的模式称为模型-视图-控制器(MVC)。
MVC 是一种软件开发的方法,它把代码的定义和数据访问的方法(模型)与请求逻辑 (控制器)还有用户接口(视图)分开来。

web各部分说明

元素 用途
Web 浏览器 通过HTTP 等协议与URL 所示的计算机通信,将HTML、CSS、图片等内容显示在页面中的软件
URL Uniform●Resource●Locator(统一资源定位符),其中包含域名。这个字符串用来表示计算机需要访问网络上的哪些内容
域名 与IP 地址挂钩的字符串(比如URL 中包含的www.beproud.jp 等字符串)
DNS 服务 可以通过域名查询IP 地址的服务器
IP 地址 用来在网络上识别我们想访问的计算机(以IPv4 地址为例,IP 地址由0 ~ 255 的数字和点组成,比如192.168.0.1)
HTTP Hypertext●Transfer●Protocol(超文本传输协议)的简称,是与被访问计算机之间的通信协议
HTML 用来描述文档(包括文字和图片等)结构的语言
CSS 描述HTML 等语言描述的文档该如何显示的语言、机制
JavaScript 在Web 浏览器上运行的程序
Web 服务器 通过HTTP 进行通信的服务器程序/ 计算机
Web 应用 在Web 服务器上运行的程序
CGI Common●Gateway●Interface(通用网关接口)的简称,Web 应用的机制之一


CGI 是Web 服务器运行Web 应用的一种机制。Web 服务器执行CGI 程序(CGI 脚本),然后将该程序的标准输出结果作为HTTP 通信的响应返回给对方。最简单的CGI 程序就是在控制台界面上显示字符串。


① 客户端发来的HTTP 请求被视为Django 的请求对象
② URL 分配器负责搜索并调用被请求的URL 所对应的视图
③ 被调用的视图视情况使用模型或模板生成响应对象
④ 响应对象作为HTTP 响应发回给用户

主要内容

参考文档是https://docs.djangoproject.com/zh-hans/3.0/

结构说明

同名文件夹下结构 功能说明
init.py: 一个空文件,声明所在目录的包为一个Python包
settings.py: 管理项目的配置信息
urls.py: 声明请求url的映射关系
wsgi.py python程序和web服务器的通信协议
manage.py 一个命令行工具,用来和Django项目进行交互,如前面创建项目就用到了该文件。
app结构 功能说明
admin 对应应用后台管理配置文件包
apps 对应应用的配置文件
models 数据模块,用于设计数据库等
tests 编写测试脚本
views 视图层,直接和浏览器进行交互

每次新建一个App我们需要将其在settings.py文件中的INSTALLED_APPS里进行注册,这样程序才能够找到这个服务。

# Application definition    注册AppINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','apps.message_form.apps.MessageFormConfig',  #z这里有语法
]

必要步骤

新建静态文件的文件夹 static
新建用户可能上传的文件或者图片的文件夹 media
新建存放app的文件包 apps
新建存放第三方的包和源码的文件包 extra_apps
新建记录依赖的第三方包,文件为requirements.txt
注意:如果之前新建app在主目录,移动到apps以后,注册的语句会自动更新追踪到apps去

简单体验留言板

在主目录的templates下存放网页html,html必须英文名,为了让这个网页生效,得分配个url给它;
配置之前需要在对应的app的views去配置一个函数

def message_form(request):#函数名任取return render(request,'message_form.html')  #指向对应的静态文件

在主urls下配置,把对应的模块(先把实现留言板功能的app导入进来)的函数

from apps.message_form.views import message_form
# 把apps这个文件夹里的留言板的视图的函数,函数返回静态文件(在templates里),import的数据需要导入视图里的函数
urlpatterns = [path('admin/', admin.site.urls),path('message_form/', message_form),#url是对应的,就调用对应视图里的函数,函数指向静态文件,发挥作用
]

大功告成,在浏览器输入网址就可以了显示静态网页了。

进阶留言板:css和html分离,最后在html引入css

方式一,css放入app里(app独立性强时候选用)

  1. 在留言板app下新建static文件夹,里面新建css文件夹,再继续在文件夹里面新建style的css文件,把原html的css代码剪切进去
  2. 然后需要在html里面链接这个css文件,为什么能自动找到,是因为django自动处理了static的url,当然,如果想要自定义寻找的目录,可以在setting里面设置# 静态文件路径 STATIC_URL = '/static/',把static改为mystatic,这样就可以在前端html里面把找寻路径改为mystatic了。
<head><meta charset="UTF-8"><link rel="stylesheet" href="/static/css/style.css">
{#    这是为了链接到该html对应的css样式,也就是链接到后端的app里面的css里去          #}<title></title>
</head>

方式二,css放入主目录(全局配置时选用)

在主目录下同上新建static和css,然后再style.css等等。
这时候django就找不到对应的css了,既然是全局就应该在setting里面配置全局,代码如下:

# 静态文件路径
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')  #一般不用绝对路径(绝对路径最好用/,好转义   )
]

进阶留言板:需求分析和表设计

数据库工作

新建数据库,选择utf8mb4,排序规则utf8mb4_general_ci。(utf8 - UTF.8 Unicode 和 utf8 general ci 也可以)
配置django的setting数据库:需要查阅文档,来配置mysql的具体代码

ENGINE – 可选值有 ‘django.db.backends.sqlite3’,‘django.db.backends.postgresql’,‘django.db.backends.mysql’,或 ‘django.db.backends.oracle’。其它 可用后端。
NAME - 数据库的名称。如果使用的是 SQLite,数据库将是你电脑上的一个文件,在这种情况下, NAME 应该是此文件的绝对路径,包括文件名。默认值 os.path.join(BASE_DIR, ‘db.sqlite3’) 将会把数据库文件储存在项目的根目录。

# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databasesDATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': "message",      #数据库名称'USER': "root",'PASSWORD': "wbzdwbzda",'HOST': "127.0.0.1"   #线上的话可以指向线上}
}

然后需要安装myqsql驱动,链接是https://www.lfd.uci.edu/~gohlke/pythonlibs/,找到mysqlclient:

mysqlclient‑1.4.6‑cp38‑cp38‑win32.whl          #这是python3.8对应的32位版本(和 python位数对应)
mysqlclient‑1.4.6‑cp37‑cp37m‑win_amd64.whl     #这是python3.8对应的64位版本(和 python位数对应)

cmd,cd到文件位置,再出来E:,然后pip install 文件名包括后缀,安装完成(如果有虚拟环境需要在pip之前进入虚拟环境再pip)

最后是迁移和同步数据库:

  1. 可以在cmd下完成
python manage.py makemigrations
再
python manage.py migrate
  1. 也可以在pycharm的Tool的Run manage.py Task按钮下完成
makemigrations(创建表)
再
migrate(表同步)

最后完成的是,可以在数据库刷新后看到django的预定义表

自定义表

表在具体app下的models.py里定义(这里要分析需求,比如留言板的姓名+邮箱+联系方式+留言,都需要一一对应数据类型,这是文档)
models的代码如下:(按住ctrl点击数据类型名,可以看到具体源码。)

from django.db import models# Create your models here.
class Message(models.Model):name = models.CharField(max_length=20,verbose_name="姓名",primary_key=True)#定义为主键,否则在数据库会有自动主键idemail = models.EmailField(verbose_name="邮箱")address = models.CharField(max_length=100,verbose_name="联系地址")message = models.TextField(verbose_name="留言信息")class Mata:verbose_name = "留言信息"verbose_name_plural = verbose_namedb_table = "my_message"

然后进行数据迁移(makemigrations + migrate),可以看到数据库刷新后出现message_form_message(后面是类名称,大写改为了小写),apps\message_form\migrations\0001_initial.py可以看到具体发生的事。
models的修改会直接改变数据库,比如db_table = "my_message"改为db_table = "message",数据库表名也会从迁移操作后发生改变,这样的便利是以后迭代维护会比较方便。

进阶留言板:马上增删改查

查询的三种方式

为了models获取数据,我们来写view
(取数据的时候,所有for message in all_messages:中的message都是models里面Message对象的实例)
数据库里面取出数据以后,数据会变成对象,所以直接对对象进行操作:

from django.shortcuts import render
# Create your views here.
from apps.message_form.models import  Messagedef message_form(request):#1.all操作,下面语句all方法返回的是queryset对象,jinxinfor循环或者切片(本身并没有sql操作)all_message = Message.objects.all()#不是取出所有数据再切片slice_query = Message.objects.all()[:1]#如果进行all_message.delete(),那么也会进行sql操作,把数据全部删除,当然,for以后也会有对应的方法可以删除print(all_message.query)    #可以打印sql语句,来看看是不是符合自己预期print(slice_query.query)#下面的for循环才是执行sql操作for message in all_message:print(message.name)#2.filter,进行for循环才会去查询数据库(大量使用)all_message =Message.objects.filter(name="bobby")#如果进行all_message.delete(),那么也会进行sql操作,把数据全部删除,当然,for以后也会有对应的方法可以删除print(all_message.query)for message in all_message:print(message.name)#3.get 返回的是一个对象,不存在或者过多会出错,直接查询sql操作message = Message.objects.get(name="bobby")print(message.name)

后端代码执行数据插入

同样在views里写:

from django.shortcuts import render
# Create your views here.
from apps.message_form.models import  Messagedef message_form(request):#一样是先实例化,再对实例的属性进行更新message = Message()message.name="bobby"message.email="bobby#imooc.com"message.address="北京市"message.message="留言"#这里因为逐渐是bobby,所以下面语句作用是,存在则更新,不存在就插入message.save()return render(request,'message_form.html')

前端表单提交

涉及到提交数据的问题,方法是POST,原理是GET是一个url,而提交又是一个url,很多时候我们把这两个合并,只需要判断即可:
准备工作,把直接拿来用的html的提交url改为同一个,在原html里改:


<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><link rel="stylesheet" href="/static/css/style.css">
{#    这是为了链接到该html对应的css样式,这个static如果改了          #}<title></title>
</head>
<body>
<form action="/message_form/" method="post" class="smart-green">
# <form action="/form/" method="post" class="smart-green">  这里把默认的改成message_form<h1>留言信息<span>请留下你的信息.</span></h1><label>
.
.
.
.<span>&nbsp;</span><input type="submit" class="button" value="提交"/></label>{% csrf_token %}
</form>

然后设计views:

from django.shortcuts import render
# Create your views here.
from apps.message_form.models import  Messagedef message_form(request):if request.method == "POST":name = request.POST.get("name","")email = request.POST.get("email","")address = request.POST.get("address","")message_text = request.POST.get("messsage","")  #这里改一下变量名,下面实例化时候会和类名冲突message =Message()message.name = namemessage.email = emailmessage.address = addressmessage.message = message_textmessage.save()return render(request,'message_form.html')

后端提取数据在前端展示

直接将后台的数据展示到前端,需要当网页GET请求时,可以:

from django.shortcuts import render
# Create your views here.
from apps.message_form.models import  Messagedef message_form(request):if request.method == "GET":all_message = Message.objects.all()if all_message:message = all_message[0]return render(request,'message_form.html', {"message":message} )else:return render(request, 'message_form.html')

继续的话,可以优化为:

from django.shortcuts import render
# Create your views here.
from apps.message_form.models import  Messageif request.method == "GET":var_dict = {}all_message = Message.objects.all()if all_message:message = all_message[0]var_dict = {"message_ins":message}return render(request,'message_form.html', var_dict )

这里需要注意,return在GET的判断语句里面,发生POST请求时就无法返回,需要修改POST逻辑,每个分支下都必须有return:

from django.shortcuts import render
# Create your views here.
from apps.message_form.models import  Messagedef message_form(request):if request.method == "POST":name = request.POST.get("name","")email = request.POST.get("email","")address = request.POST.get("address","")message_text = request.POST.get("messsage","")  #这里改一下变量名,下面实例化时候会和类名冲突message =Message()message.name = namemessage.email = emailmessage.address = addressmessage.message = message_textmessage.save()return render(request,'message_form.html',{"message_ins":message} )

最终版:

from django.shortcuts import render# Create your views here.from apps.message_form.models import  Messagedef message_form(request):#下面语句all方法返回的是queryset对象,jinxinfor循环或者切片(本身并没有sql操作)all_message = Message.objects.all()#不是取出所有数据再切片slice_query = Message.objects.all()[:1]print(all_message.query)    #可以打印sql语句,来看看是不是符合自己预期print(slice_query.query)#下面的for循环才是执行sql操作for message in all_message:print(message.name)#2.filter,进行for循环才会去查询数据库all_message =Message.objects.filter(name="bobby")print(all_message.query)for message in all_message:print(message.name)#3.get 返回的是一个对象,不存在或者过多会出错,直接查询sql操作message = Message.objects.get(name="bobby")print(message.name)#一样是先实例化,再对实例的属性进行更新message = Message()message.name="bobby"message.email="bobby#imooc.com"message.address="北京市"message.message="留言"#这里因为逐渐是bobby,所以存在则更新,不存在就插入message.save()if request.method == "POST":name = request.POST.get("name","")email = request.POST.get("email","")address = request.POST.get("address","")message_text = request.POST.get("messsage","")message =Message()message.name = namemessage.email = emailmessage.address = addressmessage.message = message_textmessage.save()if request.method == "GET":var_dict = {}all_message = Message.objects.all()if all_message:message = all_message[0]var_dict = {"message_ins":message}return render(request,'message_form.html', var_dict )

然后我们需要在html文件里面改写boby体内容,新增value,留言部分直接增加{{ message_ins.message }}

<form action="/message_form/" method="post" class="smart-green"><h1>留言信息<span>请留下你的信息.</span></h1><label><span>姓名 :</span><input id="name" type="text" value="{{ message_ins.name }}" name="name" class="error" placeholder="请输入您的姓名"/><div class="error-msg"></div></label><label><span>邮箱 :</span><input id="email" type="email" value="{{ message_ins.email }}" name="email" placeholder="请输入邮箱地址"/><div class="error-msg"></div></label><label><span>联系地址 :</span><input id="address" type="text" value="{{ message_ins.address }}" name="address" placeholder="请输入联系地址"/><div class="error-msg"></div></label><label><span>留言 :</span><textarea id="message" name="message"  placeholder="请输入你的建议">{{ message_ins.message }}</textarea><div class="error-msg"></div></label><div class="success-msg"></div><label><span>&nbsp;</span><input type="submit" class="button" value="提交"/></label>{% csrf_token %}
</form>

template 简介

标签语法

    <label><span>姓名 :</span><input id="name" type="text" value="{% if message_ins.name == "bobby" %}另一个{% endif %}" name="name" class="error" placeholder="请输入您的姓名"/><div class="error-msg"></div></label>
标签功能是,只要匹配到bobby,那么就显示为另一个
    <label><span>姓名 :</span><input id="name" type="text" value="{% ifequal message_ins.name|slice:"2" 'bo' %}另一个{% endif %}" name="name" class="error" placeholder="请输入您的姓名"/><div class="error-msg"></div></label>
匹配到前两个字母是bo的,就显示为下一个

标签参考文献,django3官方

Django框架简介-初级(简单留言板)相关推荐

  1. Django框架简介

    Django框架简介 MVC框架和MTV框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View) ...

  2. vue实现留言板的功能_基于vue和bootstrap实现简单留言板功能

    本文实例为大家分享了vue实现简单留言板功能的具体代码,供大家参考,具体内容如下 作为一个刚开始接触vue的前端小白,我想在这里记录一些学习过程,希望和大家一起进步,如有不妥处之处,请多多指教呦. 今 ...

  3. 基于javaweb+mysql的简单留言板

    基于javaweb+mysql的简单留言板 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/idea/myeclipse/sts等均可配置运行 适用 课程设计, ...

  4. php留言簿代码,php自治简单留言板代码

    php自治简单留言板代码 $lianjie = mysql_connect("localhost","root","xiaolie") or ...

  5. 【CyberSecurityLearning 附】使用PHP语言搭建简单的论坛:注册功能实现+PHP个人中心设计+简单留言板

    使用PHP语言搭建简单的论坛 简单留言板 留言 个人中心           登录                验证码           注册                头像          ...

  6. HTML5实现简单留言板1

    简单留言板之前端 最近参加培训,HTML学习也有一段时间了:感觉时间过得很快,,. 前端的开发还是有利器的–HBuilder 首先看下自动生成的模块: <!DOCTYPE html> &l ...

  7. 微信小程序简单留言板

    微信小程序入简单留言板 首先在home.wxml页面完成简单的布局 <input type="text" class="inp" placeholder= ...

  8. php简易留言板功能,PHP实现简单留言板功能的方法

    这篇文章主要为大家详细介绍了PHP简单留言板功能的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 具体内容如下: index.php error_reporting(0); //关闭NOT ...

  9. React(05):使用react完成简单留言板案例

    前言 之前学了react基本语法和jsx/组件化,这里还是用ts学习时候的本地留言板案例来实践一下之前的学习语法: 正文 注意点 引入react.react-dom.babel,development ...

最新文章

  1. openfire安装配置完全教程
  2. java url api_深入阅读java api之URL
  3. 如何在Java中使用表达式_如何在java中计算表达式?
  4. python如何导入自定义模块_【python】导入自定义模块
  5. day19_java基础加强_动态代理+注解+类加载器
  6. 你对jstl了解多少----JSTL标签之函数(慎用)
  7. linux下的screen工具配置(针对 string escape)
  8. Python的程序结构[2] - 类/Class[1] - 基类与继承
  9. HDU 4278 卡特兰,区间DP
  10. redhat7 防火墙设置
  11. 等保三级全称是什么?是什么意思?
  12. 【Go】Go语言中反射包的实现原理(The Laws of Reflection)
  13. matplotlib之等高线图
  14. Windows XP 语言栏丢失
  15. MYSQL分区表学习
  16. 计算机word文档无法预览,电脑打开Word文档内容显示不全或显示空白怎么解决
  17. 算法偏见是什么_处理人工智能的偏见如何使算法公平公正
  18. 基岩版刷铁傀儡机制和Java_我的世界:Java版1.14获得铁傀儡的四种方式,第三种千万别忘记...
  19. 攻击JavaWeb应用[3]-SQL注入[1]
  20. 二进制老鼠毒药c语言,老鼠试药  二进制问题

热门文章

  1. 没有计算机网络适配器,WinXP没有网络适配器怎么添加?本地连接消失了如何恢复?...
  2. 动脉自旋标记磁共振成像在灌注和侧支循环检测的研究进展
  3. 网络断断续续,开发者能为用户做什么?
  4. spring调用切面失效分析(类内调用自身切面方法或其他切面方法失效)
  5. sql like通配符
  6. vue2.x 标签动态设置背景问题,有透明度
  7. 【VTM10.0】xPredIntraAng函数解析
  8. Java执行动态脚本
  9. CentOS7.6 万兆网卡性能测试.
  10. 还原SQL数据库,执行 Transact-SQL 语句或批处理时发生了异常