Python之路-(Django进阶一)
Django请求生命周期:
首先,客户端发送请求到服务器的urls库,通过匹配url后面的关键字,去找指定app里面的的view。
然后,app通过判断,拿到数据库数据和html模板文件。
最后,将拿到的数据发送到客户端。
Django获取html里面数据:
前面我们说了,通过判断request.method == "POST"。request.POST.get获取数据。这样只能获取单个数据。
request.POST.getlist('name'),例如checkbox复选框和下来菜单。
文件上传:
def login(request):
if request.method == "GET":
return render(request,"login.html")
elif request.method == "POST":
obj = request.FILES.get("tijiao")
print(obj,type(obj),obj.name)
import os
file_path = os.path.join('upload',obj.name)
f = open(file_path,mode="wb")
for i in obj.chunks():
f.write(i)
f.close()
return render(request,'login.html')
else:
return redirect('/index/')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login/" method="POST" enctype="multipart/form-data">
<p>
<input type="text" name="user" placeholder="用户名" />
</p>
<p>
<input type="password" name="pwd" placeholder="密码" />
</p>
<p>
男:<input type="radio" name="gender" value=""/>
女:<input type="radio" name="gender" value=""/>
张扬:<input type="radio" name="gender" value=""/>
</p>
<p>
男:<input type="checkbox" name="favor" value=""/>
女:<input type="checkbox" name="favor" value=""/>
张扬:<input type="checkbox" name="favor" value=""/>
</p>
<p>
<select name="city" multiple>
<option value="sh">上海</option>
<option value="bj">北京</option>
<option value="tj">天津</option>
</select>
</p>
<p>
<input type="file" name="tijiao"/>
</p> <input type="submit" value="提交"/>
</form>
</body>
</html>
Django的CBV和FBV:
function base views(FBV):
urls.py
index -->函数名
views.py--def 函数(request):
........
class base views(CBV):
index --> 函数名
index -->类
from django.views import View
class home(View:
def get(self,request):
pass
def post(self,request):
pass
还有一个地方需要更改。
django项目里的urls.py在写路由关系时候需要这么写。
url(r'^home/', views.home.as_view()),
示例:
我们知道,在执行class里面的get或post方法时候,首先是在一个dispatch里面反射找到我们定义的方法,
class Home(View):
def dispatch(self, request, *args, **kwargs):
# 调用父类中的dispatch
print("before")
result = super(Home,self).dispatch(request, *args, **kwargs)
print("after")
return result def get(self,request):
print(request.method)
return render(request,'home.html') def post(self,request):
print(request.method,'POST')
return render(request,'home.html')
其实使用FBV还是CBV,其实看个人习惯,能实现需求就行,建议两种都使用。
路由器系统(url):
Django模板语言循环字典:
html写法:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
{{ user_dict.k1}}
<ul>
{% for k in user_dict.keys %}
<li>{{k}}</li>
{% endfor %}
</ul>
<ul>
{% for val in user_dict.values %}
<li>{{val}}</li>
{% endfor %}
</ul>
<ul>
{% for k,row in user_dict.items %}
<li>{{k}}-{{row}}</li>
{% endfor %}
</ul>
</body>
</html>
#在取字典的值得时候,我们有三种取发,取key、values和全部。
django写法:
USER_DICT = {
'k1':'root1',
'k2':'root2',
'k3':'root3',
'k4':'root4',
}
def index(request):
return render(request,'index.html',{'user_dict':USER_DICT})
1、单一路由:
url(r'^index$', views.index), url(r'^home/', views.Home.as_view()),
views里面定义函数的时候除了设置request形参,还需要设置设置一个形参,如果形参过多的话,容易获取的参数顺序不对
url(r'^detail-(\d+).html', views.detail),
建议使用以下这种路由,这样的话,下面函数里面的nid和nid哪个在前哪个在后就没有关系了
url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)
def func(request,nid,uid):
pass
扩展:如果使用万能参数的话,除了request参数,后面有多少个参数都行,一个参数的话就是元祖,多个的话就是字典模式。
def func(request,*args,**kwargs):
pass
路由分发:
django下的urls.py
from django.conf.urls import url,include urlpatterns = [
url(r'^cmdb/', include("app01.urls")),
url(r'^moniter/', include("app02.urls")),
]
app01下的urls.py(需要自己建)
from django.conf.urls import url,include
from app01 import views urlpatterns = [
url(r'^login/', views.login),
url(r'^orm/', views.orm),
]
app02下的urls.py(需要自己建)
from django.conf.urls import url,include
from app02 import views urlpatterns = [
url(r'^moniter/', views.login),
]
这样的话,写不同app功能的人,就不会把url搞混淆了。
Django的ORM操作:
创建数据库表结构:
一:
使用python创建项目时候自带的db.sqlite3
1、前面我们说过,创建了app以后有个叫modles.py的文件,当时说在这里创建数据的,现在我们用到了它。
在需要生成数据库表结构的app里面的models里面创建表结构(创建类,并继承modes类)。
from django.db import models # Create your models here. class UserInfo(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)
2、注册app(因为我们在一个项目里面肯定会有很多的功能,也就是有很多的app。这样的话,每个app里面都有models文件,django也不知道你要在哪个app里面创建表结构,所以我们需要先注册app)
在项目里面的settings.py里面找到如下内容,在最后添加你要创建到哪个app的名称。例如:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
]
例如我要在app01里面创建表结构
3、然后我们需要执行两个命令,
python manage.py makemigrations(执行完这个命令,在你想创建表结构的app里面的migrations里面就会多出一个东西来,这个就是表结构发生变化后,自动给你生成的文件,类似于日志)
python manage.py migrate (把上面那条命令的内容直接在数据库里面执行,也就是真正意义上的在数据库里面生成表结构)
二:
使用mysql数据库:
1、上面写的使用db.sqlites的1和2步骤执行一遍,然后执行下面的操作。
2、因为python3里面没有MySqldb这模块,而django默认使用的是它,因为python3里面我们用的pymsql,所以我们要在project同名下的__init__.py文件里面加上以下内容。
import pymysql
pymysql.install_as_MySQLdb()
3、找到项目里面有个settings.py文件,里面有个DATEBASES的字典。
把defalut默认使用sqlite3的这个全部都注释。
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
}
添加下面这些内容,注意,里面NAME是数据库名称,这个必须提前在数据库里面手动生成。
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'cmdb',
'USER': 'root',
'PASSWORD': '',
'HOST': '192.168.16.200',
'PORT': '',
}
}
4、在mysql数据库里面生成数据库表结构。
python manage.py makemigrations(执行完这个命令,在你想创建表结构的app里面的migrations里面就会多出一个东西来,这个就是表结构发生变化后,自动给你生成的文件,类似于日志)
python manage.py migrate (把上面那条命令的内容直接在数据库里面执行,也就是真正意义上的在数据库里面生成表结构)
扩展:
连接sqlite3方法:
首先需要下载navicat premium。安装好后,如下:

复制sqlite路径

将project名称完完全全的复制到连接名里面,并将上面复制的sqlite路径粘贴到数据库文件里,就OK了。

示例:
我们搞一个登陆验证的示例,使用的是sqlite3数据库。
1、创建数据方法一。
上面我们在models.py里面已经写好了数据库表结构,并已经生成了表结构。
#首先导入数据库表结构的目录
from app01 import models
#例如有个orm的字段请求,我让它发送一个请求,就帮我创建一个用户名和密码(root,123),并返回orm
def orm(request):
#下面这条才是关键,使用models.什么就是生成数据库表结构的类名,后面都是关键字,username和password都是字段名称
models.UserInfo.objects.create(username = "root",password = '')
return HttpResponse("orm")
创建数据方法二。
obj = models.UserInfo(username='zhangsan',password='')
obj.save
2、查询
result = models.UserInfo.objects.all()
for row in result:
print(row.id,row.username,row.password)
#上面这种就会取出所有的username和password的数据。 result = models.UserInfo.objects.filter(username='root',password='')
#上面这种是过滤条件,逗号充当的是and的意思
3、删除
models.UserInfo.objects.all().delete()
#删除所有数据 #删除root用户
models.UserInfo.objects.filter(username='root').delete()
4、更新
#将password字段全部都改成666
models.UserInfo.objects.all().uodate(password='') #根据过滤更新(让id等于3的这条数据的password改成666)
models.UserInfo.objects.filter(id=3).uodate(password='')
Python之路-(Django进阶一)的更多相关文章
- Python之路-(Django进阶二)
model: 双下划线: # 获取个数 # # models.Tb1.objects.filter(name='seven').count() # 大于,小于 # # models.Tb1.objec ...
- 自学Python之路-django
自学Python之路-django 自学Python之路[第一回]:1.11.2 1.3
- python web框架 Django进阶
django 进阶 基础中,一些操作都是手动创建连接的非主流操作,这样显得太low,当然也是为了熟悉这个框架! 实际中,django自带连接数据库和创建app的机制,同时还有更完善的路由系统机制.既然 ...
- python笔记-20 django进阶 (model与form、modelform对比,三种ajax方式的对比,随机验证码,kindeditor)
一.model深入 1.model的功能 1.1 创建数据库表 1.2 操作数据库表 1.3 数据库的增删改查操作 2.创建数据库表的单表操作 2.1 定义表对象 class xxx(models.M ...
- Python学习-day20 django进阶篇
Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...
- python之路 django基础
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
- Python之路-(Django(Cookie、分页))
Cookie 分页 1.获取Cookie: request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, sal ...
- python之路:进阶篇 内置函数
li = [11, 22, 33] news = map( li = [100, 2200, 3300] news = map( [13, 24, 35] [11, 11, 11] [22, 4 ...
- python之路:进阶 二
c = collections.Counter( Counter({ b = collections.Counter( b.update(c) Counter({ Counter({ ...
随机推荐
- SVN-功能介绍之切换
当初新建项目IMyYa 提交到svn 目录下file:///H:/svn/truck/IMyYa 现在svn 目录版本库中调整为file:///H:/svn/truck/Win8/IMyYa 与之前不 ...
- 【Mybatis框架】查询缓存(二级缓存)
继上一篇博客,我们讲述了mybatis的一级缓存,接下来,我们来学习一下mybatis的二级缓存 博客链接地址: http://blog.csdn.NET/liweizhong193516/artic ...
- Java上传截断漏洞的解决方案
文件上传漏洞解决方案 1. 最有效的,将文件上传目录直接设置为不可执行,对于Linux而言,撤销其目录的'x'权限:实际中很多大型网站的上传应用都会放置在独立的存储上作为静态文件处理,一是方便使用缓存 ...
- 【算法杂谈】LJX的迪杰斯特拉算法报告
迪杰斯特拉(di jie qi)算法 这里有一张图: 假设要求从1号节点到5号节点的最短路.那么根据迪杰斯特拉算法的思想,我们先看: 节点1,从节点1出发的一共有3条路,分别是1-6.1-3.1-2. ...
- 未能添加对***.dll的引用问题
在机器A上运行.编译成功的程序,在B上不能正确被编译,并且添加r如 knbook.dll 时候提示如下: 未能添加对"knbook.dll"引用,请确保此文件可以访问并且是一个有效 ...
- PHP-Redis扩展使用手册(三)
/* 序列化key对应的value,如果key不存在则返回false * @param key * @return 序列化后的val或者false */ $redis->set('key_1', ...
- 启动 apache2.4 出现 invalid command order 问题 【由于 PHP 访问权限 403 问题引起】
由于网站出现 403 禁止访问,所以修改了 httpd.conf 文件的权限如下 <Directory /> Options FollowSymLinks AllowOverride N ...
- CI,从数据库读取数据
1.准备数据库,(用户,密码,数据库服务的地址) 2.CI链接数据库,配置database.php(配置文件) //application/config/database.php 3.准备 ...
- jQuery文本段落展开和折叠效果
<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/h ...
- 【6集iCore3_ADP触摸屏驱动讲解视频】6-1 工程及程序构架介绍
视频简介: 该视频由银杏科技有限公司基于iCore3应用开发平台推出,包含 触摸屏驱动工程文件的介绍与程序构架的介绍等. 源视频包下载地址: http://pan.baidu.com/s/1dFz ...