HTTP协议
"""规定了浏览器与服务端之间数据交互的格式"""
# 1.四大特性
1.基于TCP、IP作用于应用层之上的协议
2.基于请求响应
3.无状态
见你千百遍我都当你如初见
ps:cookie、session、token...
4.无(短)连接
ps:长连接:websocket
# 2.数据格式
请求数据格式:
请求首行(请求方法...)
请求头(一大堆K:V键值对)
请求体(并不是所有的请求方法都有 主要用来携带敏感性数据)
响应数据格式:
响应首行(响应状态码...)
响应头(一大堆K:V键值对)
响应体(展示给用户的数据)
# 3.响应状态码
用简单的数字来表示一串中文意思
1XX:服务端已经接受到你的数据正在处理,你可以继续提交
2XX:200 OK>>>:请求成功
3XX:重定向(原本想访问A但是内部跳到B)
4XX:403当前请求不符合条件 404请求资源不存在
5XX:服务器内部错误
ps:除了上述统一的响应状态码之外,公司还可以自定义自己的状态码
主流web框架
1.django框架
大而全,自带的功能组件非常的多!
2.flask框架
小而精,自身的功能组件非常的少!
但是第三方模块非常之多,如果把第三方模块全部叠加起来完全可以盖过django
有时候也会受限于第三方模块
3.tornado框架
异步非阻塞,速度非常的快,快到可以开发游戏服务器
Django框架
# 注意事项
1.计算机名称不能有中文
2.项目名和py文件名最好也不要使用中文
3.django版本问题
1.x # 路由匹配使用url,第一个参数为正则
2.x # 路由匹配使用path,写什么匹配什么,提供转换器
# 可以手动改用re_path,匹配正则
3.x # 增加了异步功能
# 命令行下载
pip3 install django==1.11.11
# 测试是否安装完成
django-admin
命令行模式
# 创建django项目
django-admin startproject 项目名
### 命令行不会自动创建templates模板文件夹
### 命令行也不会自动在配置文件中配置模板文件夹路径
### ps:1.x版本如果报错需要修改py文件源码
### ...\django\contrib\admin\widgets.py
### 152行后面的逗号去掉即可!!!
### '%s=%s' % (k, v) for k, v in params.items()
# 启动django项目
cd 项目名
python manage.py runserver ip:port
# 创建app
python manage.py startapp app的名字
### django是一款专门开发app(应用)的软件
### 我们创建的app一定要去settings文件中注册才能生效
pycharm快捷方式
new project
django
项目名
解释器
应用名
### pycharm会自动帮你创建一个app,并在setting文件中注册该app
### 会自动创建templates模板文件夹,并在setting文件夹中配置模板文件夹的路径
django目录结构
mysite
mysite文件夹 # 项目同名文件夹
settings.py # django暴露给用户可以配置的配置文件
urls.py # 路由与视图函数(可以是函数也可是类)对应关系(路由层)
wsgi.py # 忽略
app01文件夹 # 应用(可以有多个)
migrations文件夹 # 存储数据库记录相关(类似于操作日志)
admin.py # django后台管理
apps.py # 注册app
models.py # 数据库相关(模型层)
tests.py # 测试文件
views.py # 视图函数(视图层)
db.sqlite3 # django自带的小型数据库
manage.py # django入口文件
templates # 模板文件(存储html文件)(模板层)
小白必会三板斧
* HttpResponse
# 返回字符串
* render
# 返回HTML页面,可以使用模板语法
* redirect
# 重定向
静态文件配置
"""
我们之所以能够在浏览器地址栏里面输入网址就可以拿到对应的资源
是因为开发者早已经提前开设了该资源的访问接口
"""
1.静态文件
写好之后不会自动动态改变的文件资源,比如我们写好的css文件、js文件、图片文件、第三方框架文件
我们默认将所有的静态文件都放在一个static文件夹内
我们需要自己在django目录下创建该文件夹
static目录下基本还会再分几个文件夹
static
css
js
img
第三方文件资源
# 在加在静态资源的时候没有开设对应的访问接口
2.配置
settings.py配置文件
# 静态文件配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static')
]
前端
<script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
3.进阶操作
STATIC_URL = '/static/' # 接口前缀
"""
如果你想要访问静态文件资源,那么必须以static开头
<script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
你书写了接口前缀之后 就拥有了访问下列列表中所有文件夹内部资源的权限
"""
# 静态文件配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
os.path.join(BASE_DIR,'static1'),
os.path.join(BASE_DIR,'static2'),
]
4.动态解析
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
request对象方法
request.method # 获取请求方式(纯大写的字符串类型)
request.POST # 获取post请求提交的普通数据(可以看成是一个字典)
.get() # 获取列表最后一个元素
.getlist() # 获取整个列表
request.GET # 获取url问好后面携带的参数(可以看成是一个字典)
.get() # 获取列表最后一个元素
.getlist() # 获取整个列表
request.FILES # 获取用户上传的文件数据(可以看成是一个字典)
### form表单如果需要携带文件数据 那么要添加参数
### <form action="" method="post" enctype="multipart/form-data">
.get() # 获取列表最后一个元素
.getlist() # 获取整个列表
request.body # 原始的二进制数据
Django测试环境搭建
ps:
1.pycharm链接数据库都需要提前下载对应的驱动
2.自带的sqlite3对日期格式数据不敏感
如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3
# 方式1:任意创建一个py文件,在该文件内书写固定的配置
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Django项目名.settings")
import django
django.setup()
# 方式2:直接使用pycharm提供的python console
Django settings源码
"""
1.django其实有两个配置文件
一个是暴露给用户可以自定义的配置文件
项目根目录下的settings.py
一个是项目默认的配置文件
当用户不做任何配置的时候自动加载默认配置
2.配置文件变量名必须是大写
"""
疑问:为什么当用户配置了就使用用户配置的 不配置就是要默认的
from django.conf import settings
settings = LazySettings()
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day05.settings")
ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"
class LazySettings(LazyObject):
def _setup(self, name=None):
# os.environ看成是一个全局大字典 'day05.settings'
settings_module = os.environ.get(ENVIRONMENT_VARIABLE)
self._wrapped = Settings(settings_module) # Settings('day05.settings')
class Settings(object):
def __init__(self, settings_module): # 'day05.settings'
for setting in dir(global_settings): # 获取全局配置文件里面所有的变量名
if setting.isupper(): # 校验是否是纯大写
setattr(self, setting, getattr(global_settings, setting))
# 给Settings对象添加全局配置文件中所有的配置信息
self.SETTINGS_MODULE = settings_module # 'day05.settings'
mod = importlib.import_module(self.SETTINGS_MODULE)
# from day05 import settings # 导入暴露给用户的自定义配置文件
for setting in dir(mod):
if setting.isupper():
setting_value = getattr(mod, setting)
setattr(self, setting, setting_value)