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({ ...
随机推荐
- C语言中的强符号与弱符号
转自:http://blog.csdn.net/astrotycoon/article/details/8008629 一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初 ...
- css样式思维导图
- IDF实验室:倒行逆施
简单的PE文件逆向(.exe-IDA) 下载下来文件之后发现是一个exe文件,运行以后发现.
- Sharepoint+Office Infopath+快速搭建问卷调查系统
项目背景 要开发供公司内部使用的N多个在线调查问卷,要求信息在统一的平台上方便跟踪及管理. 公司内部上了Sharepoint系统及大家习惯了使用infopath及Quick app for share ...
- Codeforces118D Caesar's Legions(DP)
题目 Source http://codeforces.com/problemset/problem/118/D Description Gaius Julius Caesar, a famous g ...
- Leetcode Divide Two Integers
Divide two integers without using multiplication, division and mod operator. 不用乘.除.求余操作,返回两整数相除的结果,结 ...
- 【BZOJ】3994: [SDOI2015]约数个数和
题意: \(T(1 \le T \le 50000)\)次询问,每次给出\(n, m(1 \le n, m \le 50000)\),求\(\sum_{i=1}^{n} \sum_{j=1}^{m} ...
- BZOJ1068: [SCOI2007]压缩
... 1068: [SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 909 Solved: 566[Submit][Statu ...
- C#_Express-ickd接口
爱查快递接口使用 using System; using System.Collections.Generic; using System.IO; using System.Net; using Sy ...
- JVM中,对象在内存中的布局
在hotSpot虚拟机中,对象在内存中的布局可以分成对象头.实例数据.对齐填充三部分. 对象头:主要包括: 1.对象自身的运行行元数据,比如哈希码.GC分代年龄.锁状态标志等,这部分长度在32位虚拟机 ...