type
status
date
slug
summary
tags
category
icon
password
这里写文章的前言:
一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 Python Django 入门
Django 入门(一)
02-Pycharm,创建第一个项目,Django工作流程_ev
① 创建项目,将启动配置和端口设置成监听自己的物理网卡,比如0.0.0.0,就可以让同一局域网的主机访问到

② 应用:可以理解成一个网站里面的具体的一个功能

③ 第一个页面:

④ 第二个页面:

⑤ 设置相应路径,解决部署问题:

⑥ ⑤的更优解,利用已配置好的模板文件:

⑦ 工作流程图

03-URL路由系统:配置、URL正则表达式匹配_ev
① 导入views函数(设置路由对应处理)的三种方法:
- 直接导入.py文件 然后利用.py文件调取方法渲染

- 导入.py文件的类,调用类的方法?

- 基于某层URL的基础上添加额外的URL

② URL路由系统格式:

③ 路由分发(类似于导航栏,多重URL)
- 在myapp里创建子URL,然后
- 在项目文件里的url利用include使用子url
④ 正则表达式匹配:
- index/([0-9]{4})/$
- 表示匹配index/2023 index/2022等的网址,括号代表一个组,4代表4位,$表示结尾,防止匹配到就停止
- index/([0-9]{4})/([0-9]{2})/$
- 表示匹配index/2023/12 index/2022/11等的网址
- index/([0-9]{4})/([0-9]{2})/([0-9]+)/$
- 表示匹配index/2023/12/123 index/2022/11/1421241等的网址

04-视图:HttpRequest详解1_ev
① 使用Django模板语言设置a标签的href:
- 原版: <a href="/hello">你好
- 改版: <a href="{% url "hello" %}">你好 url后面的"hello"是设置url时的name,因此,改变path('hello/',views.hello,name="hello")里的hello/为hello2/也不会影响跳转
②Django视图:
- Django内置函数

- HttpRequest对象
- HttpResponse对象
③ Http请求流程-浏览器
- 浏览器:
- 建立Tcp连接(三次握手),②发送Http请求(Request)(一些封装的浏览器信息,包括请求的方法GET/POST;请求的URL;浏览器的特征
- Web服务器:
- 响应Http请求(Response)(浏览器接收响应,一般是HTML,然后进行解析)
- 浏览器:
- 关闭Tcp连接

④ Http请求流程-Django
- PC 访问Django中的URL发送Http请求
- Django收到请求后根据URL的路由转换到不同的视图里面,其中会携带参数,就是每个视图函数所接收的request(包含着用户封装的Http数据)
- 视图处理完请求后会响应一个HttpResponse(就是返回给PC端哪些数据,由我们来封装,处理HttpRequest响应Django会帮我们完成)
- 最后Django根据程序员定义的HttpResponse返回给客户端(一般也是html),随后PC端渲染显示

⑤ Django常用属性:

⑥ Django常用方法

⑦ 接收URL参数:
def url_args(request): args1=request.GET('a') args2=request.GET('b')# a,b为任意名字 return HttpResponse(int(args1)+int(args2))

⑧ QueryDict对象:
- request.GET和request.POST返回的都是一个QueryDict对象,类似于字典
- 方法:最常用的是req.get(key,default) req.items()所有键值对 req.keys() 返回所有键

- 例:常用value=request.GET.get("value",None)来取键对应的值,如果不存在也不会报错,而是默认为None
⑨ 示例:
- 表单GET提交,例如搜索页面 request.GET
# urls.py: path('search/$',views.search)def search(request): key=request.GET.get('key') result=f'<h1>你查下的关键字{key}的搜索结果...</h1>' return HttpResponse(result)
- 表单POST提交,例如登录页面 request.POST
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>login</title></head><body> <form action="{% url 'login' %}" method="post"> 用户名:<input type="text" name="username"> 密码:<input type="password" name="password"> <button type="submit">登录</button> </form></body></html>
def login(request): if request.method=="GET": return render(request,'login.html') else: username=request.POST.get('username',None) password=request.POST.get('password',None) if username=='LjmFoN' and password=='123456': # 登陆成功 return HttpResponse("登陆成功") else: return render(request,'login.html')
05-视图:HttpRequest详解2,HttpResponse详解_ev
- 上传文件,例如修改头像 request.FILES
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>用户信息</title></head><body> <form action="{% url "users" %}" method="post" enctype="multipart/form-data"> <input type="file" name="touxiang"> <button type="submit">提交头像</button> </form><span style="color: red">{{ msg }}</span></body></html>
# urls.py: path('users/',views.users,name='users'),def users(request): if request.method=='GET': return render(request,'users.html') elif request.method=='POST': print(request.FILES) obj=request.FILES.get('touxiang',None) file_name=obj.name import os file_path=os.path.join('upload',file_name) with open(file_path,mode='wb') as f: for i in obj.chunks(): f.write(i) msg='上传文件成功' return render(request,'users.html',{"msg":msg})
① HttpResponse对象:StreamingHttpResponse和FileResponse和JsonResponse函数:
- 用StreamingHttpResponse接收大文件(视频)的好处:分块接收 类似.chunks()方法 更快的接收,更好的是FileResponse函数
- 例子:下载上传的文件,
- urls.py:
# 第一个路径是显示上传文件列表的网页,写对应的视图# 第二个路径是下载上传文件的路径,匹配所有名字叫filename的文件,然后只要输入./download/<filename>就会下载 path('upload_list/',views.upload_list), re_path(r'^download/(?P<filename>.*)$',views.download,name='download'),
- views.py:
# 这是上传文件页面的视图def upload_list(request): file_list = os.listdir('upload') return render(request, 'upload_list.html', {'file_list': file_list})# 这是下载路径对应的操作,它不返回一个页面,返回一个文件def download(request, filename): # 获取上传文件的路径(在upload目录里面,os.path.join自动拼接成upload/filename) file_path = os.path.join('upload', filename) # 将上传的文件用StreamingHttpResponse函数以二进制形式打开 # res = StreamingHttpResponse(open(file_path, 'rb')) # 优化 res = FileResponse(open(file_path, 'rb')) # 将二进制转换为浏览器能够识别的下载文件:(模板) res['Content-Type'] = 'application/octet-stream' res['Content-Disposition'] = f'attachment/filename-{os.path.basename(file_path)}' return res
- upload_list.html:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>上传列表</title></head><body> # django模板语言{% for filename in file_list %} # 将文件名字设置为一个链接,点击就跳转到设置好的下载链接下载 <a href="{% url 'download' filename %}">{{ filename }}</a><br>{% endfor %}</body></html>
- JsonResponse函数(一般返回一个接口)
- 示例:下载文件
def api(request): d = {'name':'safz','age':30} return JsonResponse(d)
06-模板:变量、标签、过滤器、继承、导入等_ev
Django模板系统(只适用于展示,不适应于实现业务逻辑)
①

② 设置全局变量,可直接给所有视图函数传值,例登入后显示用户名
- 在Django项目下创建contexts.py文件(获取登陆后的用户名)
def username(request): username=request.session.get('username') return {'username':username}
- 在settings.py文件中添加上下文处理器
'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'djangoProject1.context.username' ],
③ forloop:在{% for %}标签中生成的变量,用户获取当前循环进展的信息,常用的有:
- forloop.counter 循环计数器,返回一个循环的次数数字,从1开始
- forloop.first 判断是否是第一次是循环 是的话返回true

④ for...empty 当循环序列为空时,执行empty下面的内容
语法:
{% for <变量> in <序列> %}
<遍历>
{% empty %}
<代码块>
{% endfor %}
⑤ 过滤器:在变量被显示前修改值的一种方法
- 语法:{{ value|过滤器:参数 }}

- 自定义过滤器(当自带的过滤器无法满足需求,即可自定义过滤器处理变量显示)
- 第一 先安装到INSTALLED_APPS
- 第二 在APP文件创建templatetags(一定要是这个目录名)
- 第三 创建python文件编写过滤函数
# filters.pyfrom django.template import Libraryregister = Library() # 注册过滤器对象@register.filter # 通过装饰注册自定义过滤器def func(num): return num / 2
- 第四 在<head></head>里面加{% load python文件名 %}
- 第五 利用过滤器语法调用过滤器处理变量:{{ 123 | func }}
⑥ 注释:{# #}
⑦ 模板继承:主要是为了提高代码的重用,减轻开发人员的工作量
- 典型应用:网站的头部、尾部信息
- 第一 定义一个基础模板,也称为母版,这个页面存放整个网站共用的内容
- templates/base.html
- 第二 在子模板继承这个母版
- {% extends 'base.html'%}
- 第三 基础模板上预留子模板差异化的内容
- {% block 名称 %}预留区域{% endblock %}
- 第四 在子模板同样语法引用并填充预留区域的内容
⑧ 模板导入:导入一个模板(一般是某个网页功能)到当前页面

⑨ 引入静态文件
- STATICFILES_DIRS:告诉Django哪个目录是“静态文件的文件夹”
- STATIC_ROOT:指出浏览器访问静态文件的根目录
- 方法:
- 第一 在settings.py文件中配置:
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))STATICFILES_DIRS=( os.path.join(BASE_DIR,'static'),)STATIC_URL='/static/'
- 第二 在模板文件中引用静态文件
<link rel="stylesheet" href="/static/main.css">或者{% load static %}<link rel="stylesheet" href="{% static 'main.css' %}">
Django 入门(二)
01-数据模型:ORM、Model,ORM基本增删改查_ev
① ORM:对象关系映射(Object Relational Mapping)
- 是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换,简单来说就是在编程语言中实现的一种虚拟对象数据库。我们对虚拟对象数据库进行操作,它会转换成具体的SQL去操作数据库,这样一来就不需要学习复杂的SQL语句
- 一句话:将编程语言转换为复杂的SQL语句
② 模型类 Mdels.py (Model)
- 定义方法:
- 第一 先在models.py中定义一个类,对应数据库中生成 '应用名_类名' 的表
class User(models.Model): user=models.CharField(max_length=30) name=models.CharField(max_length=20) sex=models.CharField(max_length=10) age=models.IntegerField() label=models.CharField(max_length=100)
- 第二 在settings.py配置文件中INSTALLED_APPS列表添加APP名称
INSTALLED_APPS=[ # ... 'myapp',]
- 第三 选择数据库,并配置
- 这里选择MySQL数据库,配置:
- 第一 先安装 然后启动服务 使用docker启动一个mysql实例
docker run -d\-name db \p 3306:3306 \v mysqldata:/var/lib/mysql \e MYSQL_ROOT_PASSWORD=123456 \mysql:8.0 -character-set-server=utf8
- 第二 pip install pymsql
- 第三 在settings.py修改django 默认配置链接数据库代码
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'test', 'USER': 'root', 'PASSWORD': 'root', 'HOST': '127.0.0.1', 'POST': '3306', }}
- 第四 指定数据库驱动(否则运行数据库迁移会报错,因为django默认驱动是mysqlclient)
# app文件下的 __init__.pyimport pymysqlpymysql.install_as_MySQLdb()
- 第四 将模型类生成具体的数据库表,在控制台输出两天指令:
- python manage.py makemigrations
- python manage.py migrate
③ orm的增删改查:
- 增:以注册为案例 添加新用户 User.objects.create(...)或者用save方法保存
# views.py代码:def register(request): if request.method == 'GET': return render(request, "register.html") elif request.method == 'POST': print(request.POST) user = request.POST.get('user', None) name = request.POST.get('name', None) sex = request.POST.get('sex', None) age = request.POST.get('age', None) label = request.POST.get('label', None) User.objects.create(user=user, name=name, sex=sex, age=age, label=label) return HttpResponse("用户注册成功")
- 查:先用User.objects.all()获取所有数据,然后返回给浏览器
# views.py:def user_list(request): user_list = User.objects.all() return render(request,'user_list.html',{'user_list':user_list})# 加条件获取数据,返回的是列表User.objects.filter(user='amei')User.objects.filter(age=28)# 获取单条数据:User.objects.get(id=2)
- 改:先用filter过滤出要操作的数据项,然后更新
- User.objects.filter(user='amei').update(age=27,label='秘书,喜欢购物')
- 或者
- obj = User.objects.get(user='amei')
- obj.age=27
- obj.label='。。。'
- obj.save()
- 删:先用filter过滤出要操作的数据项,然后删除
- User.objects.filter(user='amei').delete()
- 或者
- obj = User.objects.get(user='amei')
- obj.delete()
- 作者:poze624
- 链接:https://poze624.top/notes/20221012135922
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。