一 创建Django项目
1 创建pydemo虚拟环境,务必要指定python解析器的版本
conda create -n pydemo python=3.10
2 进入虚拟环境
conda activate pydemo
3 安装django基本模块
pip install django==4.0 -i https://pypi.douban.com/simple/
4 切换到开发目录
cd ~/Django
5 快速创建django项目
django-admin startproject pydemo # pydemo 就是项目目录名
6 创建子应用
python manage.py startapp user # user为子应用名称(目录)
效果如下
文件说明
- 最外层pydemo # 项目根目录
- manage.py # 终端脚本命令, 提供了一系列用于生成文件或者目录的命令
- 内层pydemo # 主应用开发目录,保存了项目中的所有开发人员编写的代码, 目录是生成项目时指定的
- asgi.py # django3.0以后新增的,用于让django运行在异步编程模式的一个web应用对象
- settings.py # 默认开发配置文件,填写数据库账号,密码等相关配置
- urls.py # 总路由文件,用于绑定django应用程序和url的映射关系
- wsgi.py # wsgi就是项目运行在wsgi服务器时的入口文件
- __init__.py # 包初始化文件
7 在pycharm中配置运行当前项目的所在虚拟环境中的python解释器
8 运行django
python manage.py runserver
效果如下
9
二 使用Django
1 子应用的视图文件中编写视图函数
2 绑定路由和视图的映射关系
3 运行django
python manage.py runserver
4 postman工具访问
三 路由基础
图3.1 路由视图关系
1 常用的http请求方法
HTTP请求方法 | 描述 |
---|---|
POST | 添加/上传 |
GET | 获取/下载 |
PUT | 修改/更新,修改整体 |
PATCH | 修改/更新,修改部分 |
DELETE | 删除/废弃 |
2 路由分层
为了避免将来视图函数太多导致无法明确区分哪些路由属于哪一个子应用的。我们可以在刚开始项目的时候,把路由代码放回到对应的各个子应用目录下,单独存放。这就是django提供的路由分层。
2 在子应用user下创建子路由文件urls.py,并和其下面的视图文件view.py绑定代码
3 总路由文件中通过include加载子路由文件到django项目中
4 运行django
python manage.py runserver
5 postman工具访问
3 获取请求数据
user/view.py

from django.http.response import HttpResponse from django.views.decorators.http import require_http_methods from django.http import QueryDict def index(request): # print(request.method) # print(request.headers) # print(request.body) # print(request.path) """获取查询字符串""" """ 请求地址:http://127.0.0.1:8000/home/index """ print(request.GET) # <QueryDict: {}> 获取地址栏上的所有的查询字符串,组成一个QueryDict查询字典对象 """ QueryDict常用的方法有2个: get(键) 通过指定键获取最后1个值 getlist(键) 通过指定键获取所有值,并以列表格式返回 """ """ 请求地址:http://127.0.0.1:8000/home/index?name=xiaoming&mobile=13312345678&lve=swimming&lve=shopping&lve=game """ print(request.GET.get("lve")) # game print(request.GET.getlist("lve")) # ['swimming', 'shopping', 'game'] print(request.GET.getlist("name")) # ['xiaoming'] return HttpResponse("<h1>index</h1>") @require_http_methods(["POST", "PUT"]) # 注意,中括号中的请求方法名务必大写!!!否则无法正常显示 def index2(request): """获取请求体数据""" """ 访问地址:http://127.0.0.1:8000/home/index2 请求体:不设置请求体 """ # print(request.POST) # <QueryDict: {}> 获取的结果是QueryDict查询字典对象 """ 访问地址:http://127.0.0.1:8000/home/index2 请求体:name=xiaoming&age=16 """ # print(request.POST) # <QueryDict: {'name': ['xiaoming'], 'age': ['16']}> """接收原生请求体中的json数据""" """ 请求地址:http://127.0.0.1:8000/home/index2 请求体为json:'{"name": "xiaobai","age": 16}' """ # print(request.POST) # <QueryDict: {}> # print(request.body) # b'{\n "name": "xiaobai",\n "age": 16\n}' # import json # print(json.loads(request.body)) # {'name': 'xiaobai', 'age': 16} return HttpResponse("index2!") def index3(request): """接收请求体参数""" print(request.META) # 获取当前项目相关的服务器与客户端环境信息,也包含了请求头信息,以及服务端所在的系统的环境变量 """ { 'LANG': 'zh_CN.UTF-8', # 服务端系统的默认语言 'USER': 'moluo', # 服务端运行的系统用户名 'HOME': '/home/moluo', # 服务端运行的系统用户家目录路径 'DJANGO_SETTINGS_MODULE': 'djdemo.settings', # 只有在django下才有的,当前django框架运行时加载的配置文件导包路径 'SERVER_NAME': 'ubuntu', # 服务端系统名称 'SERVER_PORT': '8000', # 服务端的运行端口 'REMOTE_HOST': '', # 客户端的所在IP地址,有时候可能是域名 'SCRIPT_NAME': '', # 客户端本次请求时,服务端执行的程序所在路径 'SERVER_PROTOCOL': 'HTTP/1.1', # 服务端运行的协议 'SERVER_SOFTWARE': 'WSGIServer/0.2', # 服务端运行web服务器的软件打印信息 'REQUEST_METHOD': 'POST', # 客户端本次请求时的http请求方法 'PATH_INFO': '/home/index3/', # 客户端本次请求时的url路径 'QUERY_STRING': '', # 客户端本次请求时的查询字符串 'REMOTE_ADDR': '127.0.0.1', # 客户端的所在IP地址 'CONTENT_TYPE': 'application/json', # 客户端本次请求时的数据MIME格式 'HTTP_USER_AGENT': 'PostmanRuntime/7.26.10', # 客户端本次请求时,所使用的网络代理软件提示信息 'HTTP_ACCEPT': '*/*', # 客户端期望服务端返回的数据MIME格式格式 'HTTP_HOST': '127.0.0.1:8000', # 客户端本次请求时,所使用服务端地址 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', # 客户端期望服务端返回的数据的压缩格式 'HTTP_CONNECTION': 'keep-alive', # 客户端支持的服务端协议的链接类型,keep-alive 表示客户端支持http的长连接 } """ print(request.headers) # 获取HTTP请求头 """ { 'Content-Length': '601', // 客户端本次请求的内容大小 'Content-Type': 'multipart/form-data;', # 客户端本次请求的内容MIME类型 'User-Agent': 'PostmanRuntime/7.26.10', # 客户端本次请求的代理软件打印信息 'Accept': '*/*', 'Host': '127.0.0.1:8000', # 客户端本次请求的服务端地址 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', # 以下就是自定义请求头了 'Company': 'baidu', 'Num': '1000', } """ print("Content-Type=", request.META.get("CONTENT_TYPE")) print("自定义请求头,Num=", request.META.get("HTTP_NUM")) print("自定义请求头,Company=", request.META.get("HTTP_COMPANY")) print("Content-Type=", request.headers.get("Content-Type")) print("自定义请求头,Num=", request.headers.get("Num")) print("自定义请求头,Company=", request.headers.get("Company")) return HttpResponse("接收请求体") def index4(request): """接收上传文件""" # print(request.FILES) """ POST http://127.0.0.1:8000/home/index4 打印效果: <MultiValueDict: {'avatar': [<InMemoryUploadedFile: 1.jpg (image/jpeg)>]}> """ # print(request.FILES.get("avatar")) # 获取本次客户端上传的指定name值对应的一个文件上传处理对象 # print(request.FILES.getlist("avatar")) # 获取本次客户端上传的指定name值对应的多个文件上传处理对象 """ django在解析http协议的时候,针对上传文件,会自动实例化一个内存保存文件的文件上传处理对象InMemoryUploadedFile from django.core.files.uploadedfile import InMemoryUploadedFile """ # read() 从文件上传处理对象读取文件的内容(bytes格式内容) import os # # 处理一个上传文件[不仅是图片,任何内容都可以这样处理] # file = request.FILES.get('avatar') # with open(f"{os.path.dirname(__file__)}/{file.name}", "wb") as f: # f.write(file.read()) # 处理多个一次性上传文件 for file in request.FILES.getlist("avatar"): with open(f"{os.path.dirname(__file__)}/{file.name}", "wb") as f: f.write(file.read()) return HttpResponse("接收客户端的上传文件")
4 返回响应数据
user/view.py

from django.http.response import HttpResponse def index5(request): """响应对象:响应HTML数据""" """ return HttpResponse(content="正文内容",content_type="内容格式",status="http响应状态码") content 响应内容 content_type 内容格式,默认是 text/html status 响应状态码,默认是 200 headers 响应头,字典格式 """ """返回html内容""" return HttpResponse("<h1>你好,django</h1>") def index6(request): """响应对象:响应json数据""" # 返回字典数据作为json给客户端 # django提供了一个HttpResponse的子类JsonResponse,转换提供给我们返回json数据的 # from django.http.response import JsonResponse # data = {"name": "xiaoming", "age": 16, "sex": True} # return JsonResponse(data) # JsonResponse返回的数据如果不是字典,则必须要加上safe参数声明,并且值为False # 返回列表数据给客户端 from django.http.response import JsonResponse data = [ {"id":1, "name": "小明", "age": 16}, {"id":3, "name": "小火", "age": 15}, ] return JsonResponse(data, safe=False) def index7(request): """返回图片格式""" import os with open(f"{os.path.dirname(__file__)}/avatar.jpg", "rb") as f: content = f.read() return HttpResponse(content, content_type="image/jpeg") def index8(request): """返回压缩包格式""" import os with open(f"{os.path.dirname(__file__)}/code.zip", "rb") as f: content = f.read() return HttpResponse(content, content_type="application/zip") def index9(request): """返回数据的过程中设置响应头""" response = HttpResponse("ok") # 自定义响应头[值和属性都不能是多字节] response["company"] = "baidu" return response
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人