Django整体架构
Django整体架构
- 用户能够访问到的所有的资源 都是程序员提前暴露好的, 如果没有暴露 用户就永远访问不了
- 用户能够访问到的所有的资源 都是程序员提前暴露好的, 如果没有暴露 用户就永远访问不了
一、响应请求的三种方式
首先导入模块:from django.shortcuts import render,HttpResponse,redirect
1.1 HttpResponse
HttpResponse("响应页面内容")
# 1. 首先在urls.py配置请求路径
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^httpresponse/', views.httpresponse),
]
# 2. 编写对应函数
def httpresponse(request):
return HttpResponse("我是HttpResponse")
# 3. 浏览器中请求
http://127.0.0.1:8000/httpresponse
我是HttpResponse
1.2 render
render:返回html窗体内容
1. 返回html内容
# 1. 首先在urls.py配置请求路径
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^httpresponse/', views.httpresponse),
url(r'^renders/', views.renders),
]
# 2. 编写对应函数
def renders(request):
return render(request, "02render.html")
# 3. 浏览器中请求
http://127.0.0.1:8000/renders
我是render
2. 在html中通过字典获取后台数据**
<!--02render.html-->
<!DOCTYPE html>
<body>
<h1>我是render</h1>
{{ user }}
</body>
</html>
# 1. 首先在urls.py配置请求路径
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^httpresponse/', views.httpresponse),
url(r'^renders/', views.renders),
]
# 2. 编写对应函数
def renders(request):
user_info = {"user": "randy", 'age': 18}
# 注意:只能返回的是字典数据类型,其他数据类型则会报错
return render(request, "02render.html", {'user': user_info})
# 3. 浏览器中请求
http://127.0.0.1:8000/renders
我是render
{"user": "randy", 'age': 18}
3. locals获取所有局部变量**
<!--02render.html-->
<body>
{{ user_info }}<br>
locals可以获取当前所有局部变量:{{ num }} <br>
locals可以获取当前所有局部变量:{{ count }} <br>
</body>
</html>
# 1. 首先在urls.py配置请求路径
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^httpresponse/', views.httpresponse),
url(r'^renders/', views.renders),
]
# 2. 编写对应函数
def renders(request):
user_info = {"user": "randy", 'age': 18}
num=123
count = 890
# locals返回全部局部变量
return render(request, "02render.html", locals())
# 3. 浏览器中请求
http://127.0.0.1:8000/renders
{'user': 'randy', 'age': 18}
locals可以获取当前所有局部变量:123
locals可以获取当前所有局部变量:890
4. 获取后台数据的两种方式的比较
- 通过字典的方式传送数据,当传送多个数据编写困难,相对于locals效率高些
- 通过locals会把前名称空间中所有变量全部传送到页面中,效率相对字典底
1.3. redirect
redirect:重定向另一个页面
# 1. 首先在urls.py配置请求路径
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^httpresponse/', views.httpresponse),
url(r'^renders/', views.renders),
url(r'^redirects/', views.redirects),
]
# 2. 编写对应函数
def redirects(request):
print(request)
# return redirect('/index') # 重定向指定的路径
return redirect("https://www.baidu.com") # 重定向到指定的url
# 3. 浏览器中请求
http://127.0.0.1:8000/redirects # 进入百度页面
- 三者都需return,返回都是httpresponse对象
- rendirect重定向带数据
- render不带数据
二、 静态文件配置
引用css,js,第三方框架的时候,需要配置静态文件,否则页面将没有被渲染,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--static不是文件,是静态资源访问的接口-->
<script src="/static/bootstrap/js/jquery.js"></script>
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
<script src="/static/bootstrap/js/bootstrap.min.js"></script>
</head>
<body>
<h1>static</h1>
</body>
</html>
通常情况下 网站所用到的静态文件资源 统一都放在static文件夹下,并且需要在setttings.py 中 手动配置静态文件访问的资源,如下
STATIC_URL = '/static/' # 是访问静态资源的接口前缀
"""只要你想访问静态资源 你就必须以static开头"""
# settings.py配置,名字不可以更改
STATICFILES_DIRS = [
# 添加静态文件可以添加多个,拼接文件夹的路径
os.path.join(BASE_DIR,'static'),
os.path.join(BASE_DIR,'static1'),
# os.path.join(BASE_DIR,'static2'),
]
注意:
STATIC_URL = '/static/' # 是访问静态资源的接口前缀中static并不是你创建文件夹的名称,而是一个静态资源访问接口,名字是可以改变的,为避免修改static的修改,在引用js,css可以动态设置
接口前缀 动态解析静态文件
{% load static %}
<link rel="stylesheet" href="{% static '/bootstrap/css/bootstrap.css' %}">
<script src="{% static '/bootstrap/js/bootstrap.min.js' %}"></script>
三、 form表单
from表单默认项后台提交的方式默认为get请求,get请求携带带参数的方式是在url的后面url?username=admin&password=213213213213213
, 从而导致提交数据不安全,并且它携带的杉树大小有限制,一般采用post请求
# 采用post请求暂且要注释一个中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
3.1 form表单 action参数书写的形式
- 不写默认提交地址为当前页面
- 只写请求地址后缀(/index)
- 写全路径
3.2 request对象及方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{% load static %}
<script src="{% static 'bootstrap/js/jquery.js' %}"></script>
<link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap/js/bootstrap.js' %}"></script>
</head>
<body>
<form action="" method="post">
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-2 ">
<h1 class="text-center">登录界面</h1>
<input type="text" class="form-control" name="username"><br>
<input type="password" class="form-control" name="password"><br>
<input type="checkbox" name="hobby" value="backbll"> 篮球
<input type="checkbox" name="hobby" value="xiaoball"> 小球
<input type="checkbox" name="hobby" value="daball"> 打球<br>
<input type="submit" class="btn btn-primary"><br>
</div>
</div>
</div>
</form>
</body>
</html>
def login(request):
# if request.method == 'GET':
# # 你应该针对不同的请求方式 有不同的处理逻辑
# # print('走了我')
# # 获取请求方式 结果是一个大写的字符串
# print(request.method,type(request.method))
# return render(request,'login.html')
# elif request.method == 'POST':
# pass
"""由于get请求比较常见 并且业务逻辑简单 所以针对get不需要做逻辑判断 默认就是get请求"""
if request.method == 'POST':
# 获取前端传递过来的用户名和密码
print(request.POST) # post请求提交过来的数据 <QueryDict: {'username': ['admin'], 'password': ['123']}>
# 你可以直接将request.POST当成字典即可
username = request.POST.get('username')
password = request.POST.get('password')
hobby = request.POST.getlist('hobby')
print(username,type(username))
print(password,type(password))
print(hobby,type(hobby))
"""
<QueryDict: {'username': ['admin', 'tank'], 'password': ['123']}>
tank <class 'str'>
123 <class 'str'>
request.POST.get('username') 默认只取列列表的最后一个元素
如果你想将列表完整的取出 你必须用getlist()
"""
# print(request.GET)
# username = request.GET.get('username')
# password = request.GET.get('password')
# hobby = request.GET.getlist('hobby')
# print(username, type(username))
# print(password, type(password))
# print(hobby, type(hobby))
return render(request, 'login.html')
获取请求方式
根据获取不同的请求方式,进行不同的逻辑出来,默认为GET请求··
request.method # GET / POST,<class 'str'>
获取前端提交数据
request.POST.get("") 如果有多个数据列表比如爱好,只会获取最后一个爱好,所以他只能获取一个值,
request.POST.getlist("") 可以获取多个值,返回一个列表
post请求提交过来的数据 <QueryDict: {'username': ['admin'], 'password': ['123']}>
username = request.POST.get("username")
password = request.POST.get("password")
四、django连接数据库
- pycharm连接数据库
pycharm连接数据库 数据库可能会导致连接不上,是因为jdbc版本从而导致的,可以更改驱动版本,获奖数据库系统时间SYSTEM更该为 +8:00
django连接数据库
- 第一步在settings.py中配置数据库连接
- 第二步在--init--.py中更改数据库连接的方式
# 第一步配置文件中配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 指定数据库 MySQL postgreSQL
'NAME': 'day56', # 到底使用哪个库
'USER':'root',
'PASSWORD':'root',
'HOST':'127.0.0.1',
'PORT':3306,
'CHARSET':'utf8'
}
} # 第二步 django默认使用的是mysqldb连接数据库 但是该模块不支持了 所以你要告诉django不要用mysqldb该用pymysql连接 你可以在项目名下面的__init__.py也可以在应用名下面的__init__.py文件中指定
import pymysql
pymysql.install_as_MySQLdb()
django的orm操作
orm对象关系映射
类 数据库中的表 对象 表单记录 对象获取属性 记录的某个字段对应的值 优点:能够让一个不会数据库操作的人 也能够简单快捷去使用数据库
缺点:由于封装程度太高 可能会导致程序的执行效率偏低,有时候 结合项目需求 可能需要你手写sql语句
注意事项:django的orm不会自动帮你创建库,库需要你自己手动创建,表会自动帮你创建 你只需要书写符合django orm语法的代码即可,去应用下所在的models.py中书写类
- 创建表
# models.py
class UserInfo(models.Model):
# 设置id字段为userinfo表的主键 id int primary key auto_increment
id = models.AutoField(primary_key=True) # 在django中 你可以不指定主键字段 django orm会自动给你当前表新建一个名为id的主键字段
# 设置username字段 username varchar(64) CharField必须要指i定max_length参数
username = models.CharField(max_length=32) # 在django orm中 没有char字段 但是django 暴露给用户 可以自定义char字段
# 设置password字段 password int
password = models.IntegerField()
# phone = models.BigIntegerField(default=110) # 新增的字段 可以提前设置默认值
# addr = models.CharField(max_length=64,null=True) # 新增的字段 可以设置为空- 新增的字段,设置默认值,或指明为空
创建表需要两条命令:
python manage.py makemigrations # 初始化表,会在migrations文件夹中创建0001——initila.py,创建一条记录
python manage.py migrate
第一步:在models.py中创建与之对应的表类,(如果没有指定id,他会自动创建一个id为主键,并且id只能用于主键,)
第二步: 使用 python manage.py makemigrations 执行该命令会在migrations文件夹中产生0001\_\_initial.py文件,同时会产生一条记录,数据库中并没有创建真实的数据库,
第三步: 使用python manage.py migrate. 执行该命令会真实创建用户信息表,第一次创建,Django也会创建其他的数据库
<span style="color:red">注意:</span>一旦 你在models.py中修改了跟数据库相关的代码 你就必须重新开始执行上面两条命令
* 如果想要修改字段,可以在创建类中进行修改<span style="color:red">慎重</span>,重新之中上面的两条命令
5. 数据库的增删改查
查询数据
get(),filter(),all()
``` python
# 查询数据
def login(request):
if request.method == 'POST':
username = request.POST.get("username")
password = request.POST.get("password")
# 1.get() 当查询条件不存在的时候 会直接报错 如果存在会直接给你返回 数据对象本身 不推荐使用
# res = models.Userinfo.objects.get(username=username) # select id,username,password from userinfo where username='jason'
# print(res)
# print(res.username)
# print(res.password)
# 2.filter() 当查询条件不存在的时候 不会报错而是返回一个空
# 当条件存在的情况下 无论数据有几条返回的都是列表套对象的数据格式
# filter可以当多个查询条件 并且是and关系
res = models.Userinfo.objects.filter(username=username) # select * from userinfo where username='jason' and password=123;
# user_obj = res[0]
# user_obj = res[0:3]
# user_obj = res[-1] # 你可以将filter查询出来的结果当做列表去对待 支持正数的索引取值和切片 不支持负数
user_obj = res.first() # 取queryset第一个元素
print(user_obj)
return render(request,'login.html')
get用法:
当查询条件不存在的时候 会直接报错 如果存在会直接给你返回 数据对象本身 (不推荐使用),\
- 多个查询条件是and关系
直接返回对象本身
filter:
- 当查询条件不存在的时候 不会报错而是返回一个空
- 当条件存在的情况下 无论数据有几条返回的都是列表套对象的数据格式
- filter可以当多个查询条件 并且是and关系
- 查询结果为列表,不推荐使用切片获取,支持正数的所有取值和切片,不支持负数
- 返回对象列表
注意:使用get条件查询,查不到数据就会报错,尽量使用filter查询数据
创建数据
# 插入数据
def reg(request):
if request.method == 'POST':
username = request.POST.get("username")
password = request.POST.get("password")
# 直接将用户名和密码写入数据库
user_obj = models.Userinfo.objects.create(username=username,password=password)
# insert into userinfo(username,password) values('admin','666');
# create方法会有一个返回值 返回值就是当前被创建的数据对象
print(user_obj)
return render(request,'register.html')
# 修改数据
def update(request):
user_id = request.GET.get("id")
print(user_id)
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
models.UserInfo.objects.filter(pk=int(user_id)).update(username=username, password=password) # 会修改查询到的数据全被修改
return redirect('/index')
user_dic = models.UserInfo.objects.filter(pk=int(user_id)).first()
return render(request, 'update.html', locals())
"""
1.方式1
modeles.Userinfo.objects.filter(**kwargs).update() # 批量更新
2.方式2 (不推荐使用 效率极低 会将每一个字段对应的值全部重写一遍)
edit_obj = models.Userinfo.objects.filter(pk=edit_id).first() # pk会自动帮你查找当前表的主键字段
edit_obj.username = username
edit_obj.password = password
edit_obj.save()
"""
# 删除数据
def delete(request):
user_id = request.GET.get("id")
models.UserInfo.objects.filter(pk=int(user_id)).delete()
# rendirect重定向带数据
# render不带数据
return redirect('/index')
"""
删除
models.Userinfo.objects.filter(pk=delete_id).delete()
"""说真正的数据是不会被删除的 通常都是给数据设置一个是否删除的标志位"""
"""
一张大表化成两张表一对一
Django整体架构的更多相关文章
- SLAM+语音机器人DIY系列:(二)ROS入门——2.ROS系统整体架构
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- Django框架架构总览
Django框架架构总览 理解Django是如何运作的 条目创建于 2013-08-14 1464 views 服务器君一共花费 15.204 ms 进行了 4 次数据库查询,努力地为 ...
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- Underscore 整体架构浅析
前言 终于,楼主的「Underscore 源码解读系列」underscore-analysis 即将进入尾声,关注下 timeline 会发现楼主最近加快了解读速度.十一月,多事之秋,最近好多事情搞的 ...
- jQuery 2.0.3 源码分析core - 整体架构
拜读一个开源框架,最想学到的就是设计的思想和实现的技巧. 废话不多说,jquery这么多年了分析都写烂了,老早以前就拜读过, 不过这几年都是做移动端,一直御用zepto, 最近抽出点时间把jquery ...
- [转]Android App整体架构设计的思考
1. 架构设计的目的 对程序进行架构设计的原因,归根到底是为了提高生产力.通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点, ...
- jQuery整体架构源码解析(转载)
jQuery整体架构源码解析 最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性, ...
- 《深入理解bootstrap》读书笔记:第二章 整体架构
一. 整体架构 1. CSS-12栅格系统 把网页宽度均分为12等分(保留15位精度)--这是bootstrap的核心功能. 2.基础布局组件 包括排版.按钮.表格.布局.表单等等. 3.jQu ...
- Nginx的负载均衡 - 整体架构
Nginx的负载均衡 - 整体架构 Nginx版本:1.9.1 我的博客:http://blog.csdn.net/zhangskd Nginx目前提供的负载均衡模块: ngx_http_upstre ...
随机推荐
- 初学C#之变量、占位符、转义符、还有就是类型转换
㈠.定义变量 先定义再赋值 int Num1; Num1 = ; 定义的同时赋值 ; 定义多个变量同时赋值,先决条件变量类型相同,例如: string phome = "1891250888 ...
- java使用BigDecimal 实现随机金额红包拆分算法
原创代码,引用注明出处:https://www.cnblogs.com/guangxiang/p/12218714.html @Servicepublic class SplitRedPacketsS ...
- torch.Tensor文档学习笔记
A torch.Tensor is a multi-dimensional matrix containing elements of a single data type. 张量(torch.Ten ...
- git 一些操作
1. 代码相关 克隆代码 git clone xxx.git 拉取代码 git pull 查看 修改的 状态 git status 推送代码 git push add 或者 修改代码之后 回滚到 未修 ...
- java课程之团队开发冲刺阶段1.9
一.总结昨天进度 1.学习了简单的消息推送方法,并且能够使用进行每日定时推送 二.遇到的困难 1.在每日推送的过程中,程序必须被正常关闭,如果程序是被切到后天然后直接结束进程的话,每日推送的线程服务也 ...
- centos6-7 yum安装php的方法
1.检查当前安装的PHP包 yum list installed | grep php 如果有安装的PHP包,先删除他们 yum remove php.x86_64 php-cli.x86_64 ph ...
- 开源PLM软件Aras详解七 在Aras的Method中如何引用外部DLL
在实际的项目中,Aras内部的方法可能并不能完全满足我们,比如Office的组件,就必须引入,那么在Aras内部的Method中,我们如何引入外部Dll文件 首先,我们新建一个Dll文件,简单的Dem ...
- 文献阅读报告 - Pedestrian Trajectory Prediction With Learning-based Approaches A Comparative Study
概述 本文献是一篇文献综述,以自动驾驶载具对外围物体行动轨迹的预测为切入点,介绍了基于运动学(kinematics-based)和基于机器学习(learning-based)的两大类预测方法. 并选择 ...
- win10使用笔记本自带显卡GUP安装CUDA,版本问题
1.GPU算力问题 查询:win+r, GPU:GeForce GTX 850m,算力5.0,还可以跑得起来深度项目 2.我们需要查看NVIDIA驱动版本,才能安装合适的CUDA版本. 在C:\Pro ...
- Mybatis实现联合查询(六)
1. 疑问 在之前的章节中我们阐述了如何用Mybatis实现检查的查询,而我们实际的需求中,绝大部分查询都不只是针对单张数据表的简单查询,所以我们接下来要看一下Mybatis如何实现联合查询. 2. ...