web应用
web应用顾名思义就是用户可以通过web来访问的一种应用程序,它有两种模式。
~ B/S模式 浏览器端/服务器端
~ C/S模式 客户端/服务端
又因为用户多通过浏览器来访问web应用,所以多是B/S模式。其根本就是由socket来实现的。

import socket def handle_request(client): request_data = client.recv(1024) print("recv_data: ",recv_data) client.send("HTTP/1.1 200 OK status: 200 Content-Type:text/html ".encode("utf8")) #需要遵循http协议 client.send("<h1>Hello,World!</h1><img src=''>".encode("utf8")) def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost',8812)) sock.listen(5) while True: print("the server is waiting for client-connection....") connection, address = sock.accept() handle_request(connection) connection.close() if __name__ == '__main__': main()
http协议
http是超文本传输协议的缩写。
~ 基于TCP/IP协议的应用层协议
~ 响应模式,只有从客户端开始建立连接
~ 对之前的请求和响应不进行保存
~ 每次只创建一个连接
请求协议包括两种请求方式:
~ get请求 get请求通常是在url后加上问号来发送数据,并且有大小限制
~ post请求 把数据放在请求体中,没有大小限制
django简介
MVC设计模式
所谓MVC就是把Web应用分为模型(Model),控制器(Controller)和视图(View)三层,模型负责业务对象和数据库的关系映射,视图层负责页面,控制器负责根据请求实现响应操作。
MTV设计模式
M(Model)层,负责数据库和业务对象的关系映射,T(Templete)层,负责页面的设计(也就是一堆html文件),V(view),负责主要的业务逻辑。其实和MVC本质上都是一样的。
实现一个基本的django工程的步骤:
1,首先在model.py文件中创建所需要的表单关系。
2,在url.py文件中的urlpattners中设置路由。
3,在view.py文件中编写自己的业务逻辑。
4,在Templete中,设计前端页面。
注:1,若要使用SQLite外的数据库,需把settings.py文件中的DATABASES修改,如mysql:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'bms', # 要连接的数据库,连接前需要创建好 'USER':'root', # 连接数据库的用户名 'PASSWORD':'', # 连接数据库的密码 'HOST':'127.0.0.1', # 连接主机,默认本级 'PORT':3306 # 端口 默认3306 } }
2,数据库迁移命令
makemigrations;migrate
3,跨站请求伪造保护,csrf_token,在settings文件中注释掉,或者在模板中加入csrf_token标签。
4,如果你的sqlite打不开,或者报错,多半时因为你的dirver没有安装。
MVC
路由控制
本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行。
里有正则表达式与URL进行匹配,在1.6版本之前,都是用url调用的,现在使用path和rpath。
普通匹配
from django.conf.urls import url from . import views urlpatterns = [ repath('articles/2003/$', views.special_case_2003), repath('articles/([0-9]{4})/$', views.year_archive), repath('articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),]
反向解析 (通过别名联系到url)
from django.conf.urls import url from . import views urlpatterns = [ path('articles/2003/', views.special_case_2003 name =case_2003), rpath('articles/([0-9]{4})/', views.year_archive name= year), rpath('articles/([0-9]{4})/([0-9]{2})/', views.month_archive),]
分组
from django.conf.urls import url from . import views urlpatterns = [ repath('articles/2003/$', views.special_case_2003), rpath('articles/(?P<year>[0-9]{4})/', views.year_archive), rpath('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),]
View
视图层,接受web请求并返回响应,响应一定要存在。
django将请求报文中的请求行、首部信息、内容主体封装成 HttpRequest 类中的属性。
requst.GET QueryDict类型,类似于字典的对象,包含了http get的所有参数。
request.POST QueryDict类型,将请求中的表单数据进行封装
request.body 字符串类型 代表了请求报文的主体,在处理非http形式的报文很有作用,如json
request.path 字符串类型,返回请求的路径。
request.method 字符串类型 , 返回请求方式,如"post","get"
request。FILES 包含所有的上传文件的信息
request.user 表示当前登陆的用户对象
request.COOKIES 包含所有的cookie
request.session 表示当前会话
HttpResponse对象
1,Httpresponse() 括号内加入字符串作为响应体
2,render() 括号内有三个参数
1)request 用于生成响应的请求对象
2)template_name 模板的文件名
3)context 一个字典,用于渲染模板
3,redirect() 重定向一个硬编码的url
Template
template需要将自己的路径添加到settings.py中。django将html文件直接耦合到自己的工程中。
模板语法
1,变量
{{ name. }} 注:可以使用句点符,但是不能需要参数
2,过滤器
1),{{obj | default:noting }}如果为空使用默认值
2),{{obj | length}} 返回值的长度
3),{{obj | filesizeformat}} 数据大小格式化,转换为人类可读的
4),{{obj | date:"Y-m-d"}} 转换为格式化的日期
5),{{obj | truncatechar:5}} 长度超过指定数值的用。。。结尾
6),{{obj | safe}} 确保变量不会被转义
3,标签
1),{%for i in list %} {%endfor%} 注:循环序号可以用 forloop.counter表示
2),{% if %} {%else%} {%end if%}
3),{%with%} 使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的
4),{%csrf-token%} 用于跨站请求伪造保护