web框架之Django(python3⼊门)⼀、初识Django
Django 是⼀个web框架
web框架的本质
- web框架的本质就是⼀个socket服务端(帮你处理了socket,让你只需要专注于逻辑处理)
- 符合wsig协议的web服务器
b/s架构:浏览器---服务器,本质也是c/s架构
⼆、HTTP协议
http请求协议:
请求⾸⾏:
请求的⽅法空格请求地址空格请求协议
GET /index HTTP/1.1\r\n
请求头:
(key:value的形式展现)
'Connection: keep-alive\r\n
Pragma: no-cache\r\n
Cache-Control: no-cache\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36\r\n Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n\r\n'
请求体:
可以携带data数据(向服务器发送的数据)
如:⽤户名/密码等信息
http请求协议
http响应协议:
响应⾸⾏:
HTTP/1.1 200 OK \r\n
响应头:
key:value \r\n
xx:xx \r\n
yy:yy \r\n
响应体:
响应数据...
http响应协议
三、Web框架简介
把⼀个请求拆分成⼏部分,每个部分⼲相同的事
Python中的web框架:
Django:⼤⽽全的框架
flask:轻量级微框架
Tornado:⾼性能的框架
MVC架构
M:模型层,model
V:视图,对应django中的T
C:控制器,根据⽤户的请求地址,执⾏某些代码
MTV架构
django是MTV架构的
M:模型层,数据操作层,model
T:模板层,template
V:视图层,view
路由控制+视图层是mvc的c层
四、Django的安装和使⽤
- 安装Django的三种⽅式:
1 在cmd窗⼝下:pip3 install django == 1.11.9
2 在pycharm的Terminal窗⼝下: pip
3 install django == 1.11.9
3 在pycharm - setting中安装,选择版本号: 1.11.9
- 卸载Django
1 pip3 unistall django
2 在pycharm-setting中进⾏卸载
- 安装完成后dgango后会在python36\Scripts,会多⼀个
- 创建Django项⽬
命令⾏ django-admin startproject myfirstdjango(了解就⾏)
五、Django项⽬的⽬录结构
- manage.py 项⽬⼊⼝运⾏项⽬需要⽤到
- templates⽂件夹:放模板⽂件,放html模板
- 项⽬名的⽂件夹(*****现阶段需要记住的)
setting.py 项⽬配置⽂件(整个项⽬的配置信息) *****
urls.py 路由和函数的映射关系 *****
wsgi.py django框架帮咱写的socket
- app名字的⽂件夹
migrations 数据库迁移相关的,记录变化的⽂件
admin.py 后台管理相关(知道就⾏)
apps.py app的配置信息(app⾃⼰的配置信息)
models.py 数据库相关,函数取数据⽤的 *****
tests.py 测试相关的
views.py 视图(业务逻辑) *****
- app的概念(每个django项⽬⾄少有⼀个app)
⼤学 ---- django项⽬
xx学院 ---- ⼀个个的app
创建app的命令(新建app01)
python3 manage.py startapp app01
六、运⾏Django项⽬
python3 manage.py runserver
重点*****
安装django
创建django项⽬
创建app
运⾏项⽬
第⼀种⽅式-命令⾏
- pycharm中创建项⽬输⼊项⽬名称+⾃定义app名称+解释器选择
- pycharm中运⾏项⽬绿⾊箭头运⾏
第⼆种⽅式-⽤pycharm
七、Django框架的简单使⽤
-
django项⽬中重点需要关注的⽂件夹:
- urls.py
- views.py
- models.py
Django项⽬⽂件夹中重点关注的⽂件
1 在浏览器输⼊ 127.0.0.1/index 并在页⾯显⽰hello django
> ⾸先在views.py中键⼊新⼿三件套
from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.shortcuts import redirect
> 其次在views.py中输⼊index页⾯的函数
def index(request):
return HttpResponse('hello django') #可以向浏览器返回字符串
> 接着在urls.py中新增路由和函数的映射关系
from app01 import views
urlpatterns = [
url(r'^index/', views.index),
]
> 接着点击绿⾊箭头运⾏该项⽬
> 最后打开浏览器输⼊ 127.0.0.1/index查看页⾯显⽰内容
debian国内源Django框架的简单使⽤之⼀
2 在浏览器输⼊ 127.0.0.1/index 向浏览器返回⼀个页⾯
> ⾸先在views.py中键⼊新⼿三件套
from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.shortcuts import redirect
> 其次在views.py中输⼊index页⾯的函数
def index(request):
#render是⼀个⽅法,第⼀个参数传request对象,第⼆个参数是模板⽂件的名字
return render(request,'index.html')
> 接着在templates⽂件夹中新建html页⾯,命名问index.html,并在页⾯中随意写⼀些内容 <body>
<h1>django的index页⾯</h1>
<a href="baidu">点我看美⼥</a>
</body>
> 在浏览器输⼊ 127.0.0.1/index 查看结果
Django框架的简单使⽤之⼆
3 在浏览器输⼊ 127.0.0.1/index 重定向到www.baidu
> ⾸先在views.py中键⼊新⼿三件套
from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.shortcuts import redirect
> 其次在views.py中输⼊index页⾯的函数
def index(request):
# 返回重定向
# 1xx 接受的请求正在处理,信息性状态码
# 2xx 成功状态码
# 3xx 重定向状态码
# 4xx 客户端错误状态码
# 5xx 服务器错误状态码
return redirect('www.baidu')
> 在浏览器输⼊ 127.0.0.1/index 查看结果
Django框架的简单使⽤之三
⼋、Django框架层⾯分析
- 路由层:
- 基本使⽤
# url是⼀个函数,函数参数,第⼀个参数是⼀个正则表达式
# ⽤户请求的路径只有匹配成功,才去执⾏后⾯的函数
url(r'^index$,views.index)
路由层
- ⽆名分组
url(r'^index/(\d+)/(\d+)', views.index)
括号内的内容会被分组区分开,当作⼀个个参数,传⼊到都好后⾯的views.index视图函数中视图函数会接受这些参数
⽆名分组
- 有名分组
url(r'^index/(?P<cc>\d+)/(?P<ee>\d+)', views.index)
括号内的内容会被分组分出来,当作参数,以key:value的形式传⼊后⾯的视图函数
视图函数会接受这些参数
有名分组
- 反向解析
2 反向解析,通过名字,反解出名字对应的url地址
例1:应⽤在视图函数中
urls.py
url(r'^test222/$', st,name='ttt')
views.py
from django.shortcuts import reverse
def index(request):
url = reverse('ttt')
return redirect(url)
例2:应⽤在模板中
<a href="{% url 'ttt' %}">点我看新美⼥</a>
反向解析
- 路由分发
例如:
使⽤命令创建app02 python3 manage.py startapp app02
### 注意,新建app⼀定要在setting.py中进⾏注册
### 注册app,两种⽅式都可以,官⽅推荐使⽤下⾯的第⼀种
到INSTALLED_APPS = [],并在其中添加以下命令,
1 'app02.apps.App01Config',
2 'app02',
使⽤⽅式:
1 在项⽬⽂件夹的urls.py中,控制不同app的urls.py
urlpatterns = [
url(r'app01/',include('app01.urls')), #正则部分不能加结束符$
url(r'app02/',include('app02.urls')), #正则部分不能加结束符$
]
2 在app01⽂件夹中的urls.py中,控制本app的路由
urlpatterns = [
url(r'^app01test/', st),
]
3 在app02⽂件夹中的urls.py中,控制本app的路由
urlpatterns = [
url(r'^app02test/', st), #给该条路由重命名为ttt
]
4 在不同app的⽂件夹中的views.py⽂件中输⼊定义test函数
5 在web页⾯中输⼊测试:127.0.0.1:8000/app01/app01test/
127.0.0.1:8000/app02/app02test/
路由分发
- django2.0版本的path
- django2.x的re_path就是1.x的url
- django2.x的path是新增的功能
path('准确路径',st,name='ttt')
Django2.x版本的path了解
-视图层
-
以get形式传的参数,直接拼接在路径后⾯,例如:127.0.0.1:8000/index/?name=lich&age=18
这种⽅式的传参,并没有把数据放在http协议的请求体中,⽽是直接放到请求头部了
(post提交的数据,才放在请求体中)
- 请求对象request
# request是⼀个请求对象
# 请求⽅法
hod) # 再浏览器⾥发的请求都是GET
# 请求地址
print(request.path) #访问的地址是/index/
# 请求全路径
_full_path()) # <QueryDict: {}>当作⼀个字典
#请求get形式传参
print(request.GET) #没有传参<QueryDict: {}>,所以为空
# 127.0.0.1:8000/index/?name=lich&age=18 这是传参⽅式
# 请求体的内容
print(request.body)
# 以post形式传的参数
# print(request.POST)
# 查看请求源IP地址 REMOTE_ADDR 客户端请求源IP的字段,可以从这个字典中取出
{'PATH': '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/aria2/bin:/Applications/Wireshark.app/Contents/MacOS', 'PYTHONPATH': '/Applications/PyCharm.app/Contents/helpers/pycharm_matplotlib_backend:/Users/lich/PycharmProjects/ ### 注意:遇到403Forbidden,优先跑到setting.py中
#先注释掉下⾯这⾏,等讲到中间件的时候再展开讨论
# 'django.middleware.csrf.CsrfViewMiddleware',
视图层
- 模版层
- DTL:Django Template Language - django的模版语⾔
- {{ }}
1,通过"."来做深度查询
例如:
views.py配置
import time
class Person():
def__init__(self,name):
self.name = name
def index(request):
#例1:
# ctime = str(time.time())
#
# return render(request,'new_index.html',{'time':ctime})
#例2:
ctime = str(time.time())
dic = {
'name':'lich',
'age':18
}
li = [1,2,3,4,5]
def test():
return'我是个函数'
lich = Person('lich')
#locals() 会把该函数中的所有的变量,构造成字典并传送到模板中
return render(request,'new_index.html',locals())
new_index.html配置
<body>
{# 模版语⾔例1: #}
<h1>模版语⾔之变量</h1>
<p>{{ ctime }}</p>
<p>{{ dic }}</p>
{#模板语法和python语法有点区别,直接⽤.就可以取值#}
{#在模板中写的变量,相当于print该变量,变量都是字符串#}
<p>{{ dic.name }}</p>
<p>{{ dic.age }}</p>
<p>{{ li }}</p>
{#取第⼀个值li.0#}
<p>{{ li.0 }}</p>
<p>{{ li.0 }}|{{ li.1 }}|{{ li.2 }}</p>
<p><a href="{{ dic.name }}">{{ li.3 }}</a></p>
{#执⾏⼀个函数,不要加括号#}
<p>{{ test }}</p>
{#打印了⼀个对象的内存地址#}
<p>{{ lich }}</p>
{#对象取值#}
<p>{{ lich.name }}</p>
</body>
urls.py配置
urlpatterns = [
# url(r'^index/$', views.index), #正则部分不能加结束符$
# url(r'^login/$', views.login), #正则部分不能加结束符$
url(r'^index/$', views.index), #正则部分不能加结束符$
]
2,过滤器
语法: {{obj|filter_name:param}} 变量名|过滤器⽅法名称:参数
### 记住date 和 safe 就可以了(xss作为了解)
views.py配置
import time
import datetime
class Person():
def__init__(self,name):
self.name = namehtml网页制作入门
def index(request):
#例1:
# ctime = str(time.time())
#
# return render(request,'new_index.html',{'time':ctime})
#例2:
ctime = str(time.time())
右组词2个字一年级dic = {
'name':'lich',
'age':18
}
属于数据与事实数据库的有哪些li = [1,2,3,4,5]
def test():
return'我是个函数'
#⽣成对象
lich = Person('lich')
count = 10
i = 1024
b = False
a = True
dat = w()
ss = '<input type="text" name="name">'
xss = '<script>alert(123)</script>'
#locals() 会把该函数中的所有的变量,构造成字典并传送到模板中
return render(request,'new_index.html',locals())
nex_index.html配置
{#过滤器,相当于将count所代表的数值+1#} #记住safe date 其他的了解即可
{{ count|add:1 }}
<p>{{ b }}</p>
<p>{{ b|default:'bbbbb' }}</p>
<p>{{ a|default:'aaaaa' }}</p>
{#列表长度计算#}
<p>li的长度为{{ li|length }}</p>
{#通过filesizeformat进⾏单位计量转换#}
<p>{{ i|filesizeformat }}</p>
{#时间格式化过滤器#}
<p>{{ dat }}</p>
<p>{{ dat|date:'Y-m-d H:i:s' }}</p>
{#可以在views.py写⼀些 html的语法,如果要在web显⽰出来功能,则需要使⽤safe#}
<p>{{ ss }}</p>
<p>{{ ss|safe }}</p>
{#跨站脚本攻击演⽰,django已经帮我们处理了这个,如果我们认为是安全的脚本,则使⽤safe#} <p>{{ xss|safe }}</p>
模版层-{{}}的⽤法
未完待续
模版层-{% %}的⽤法
- ORM
ORM是什么?
不是django独有或者python独有的
对象关系映射
python中主流的⼏个ORM框架
django的orm(django已经封装好了,必须在django中使⽤)
sqlAchemy 第三⽅的orm框架(这个可以单独拿出来使⽤)--- Flask框架并没有orm,会⽤到sqlAchemy ⾃⼰写
orm不能创建数据库,只能创建表,删除表,新增字段,删除字段
通过orm创建user表
第⼀步在settings.py配置
DATABASES={
'ENGINE':'django.sql',
'NAME':'数据库名字',
'HOST':'mysql IP',
'PORT':3306,
'USER':'数据库⽤户名',
'PASSWORD':'数据库密码'
}
第⼆步链接数据库,操作数据库的模块(pymysql)
vb新手基础入门教程- mysqlDB 只能python 2.x⽤(django内置这个模块)
- pymysql python2.x 和3.x 都可以⽤
- 所以需要在__init__.py下写⼀⾏代码(⼀般情况写在app下⾯的__init__中)
import pymysql
# 让pymysql替换掉原来django中内置的mysqldb的地⽅,以后操作mysql,就⽤pymysql这个模块
pymysql.install_as_MySQLdb()
第三步创建⼀个表(在models.py中创建新表)
# 创建⼀个user表,在orm中,其实就是写⼀个类
class User(models.Model):
# 在这个类中,写⼊需要创建的字段
# id字段,⾃增,int类型,是主键
id = models.AutoField(primary_key=True)
# name字段,varchar类型,长度32
name = models.CharField(max_length=32)
# pwd字段,varchar类型,长度32,可以为空
pwd = models.CharField(max_length=32, null=True)
第四步:
把新建表同步到数据库,django项⽬中的migrations⽂件夹存放数据库迁移的记录
按次序执⾏下⾯两条指令:
python3 manage.py makemigrations # 数据表变化的记录
python3 manage.py migrate # 数据库同步命令(数据库的表就会发⽣变化)
- 通过orm创建user表
通过上⾯的四个步骤,就可以创建出user表
新增表、删除表、新增字段、删除字段 --- ⼀个class就是⼀张表,删除=注释代码+执⾏两条命令,新增=新增字段代码+执⾏两条命令class User(models.Model):
# 在这个类中,写⼊需要创建的字段
# id字段,⾃增,int类型,是主键
id = models.AutoField(primary_key=True)
# name字段,varchar类型,长度32
name = models.CharField(max_length=32)
# pwd字段,varchar类型,长度32,可以为空
pwd = models.CharField(max_length=32, null=True)
# 增加字段
xx = models.CharField(max_length=64)
# # 再增加个字段
# yy = models.CharField(max_length=64, null=True)
#
# # 再增加⼀个字段
# zz = models.CharField(max_length=64, null=True, default='www')
#
python入门教程app# # 删除字段(只要注释掉然后两条命令同步下就好了)
⽅式⼀:
在termimal中执⾏ python3 manage.py makemigrations
python3 manage.py migrate
⽅式⼆:
pycharm-tools-‘run manage.py Task..'-在命令输⼊框中输⼊migrations-在命令输⼊框中输⼊migrate
1 单表的增删改查
# 为了验证测试⽅便,写了这个脚本⽤来验证orm 数据增删改查
import os
if__name__ == '__main__':
import django
django.setup()
from app01 import models
(紧接着上⾯的脚本写下去)
# 新增⽤户
# ⽅式⼀,通过对象来保存数据
# user = models.User(username=name, passwd=pwd)
# user.save()
# return HttpResponse('新增成功')
# ⽅式⼆表模型 (常⽤⽅式)
# user = models.ate(username=name,passwd=pwd)
# print(user.username)
#
# return HttpResponse('create successful')
# 查询id=1的⽤户
# ret = models.User.objects.filter(id=1) #结果是queryset对象,内部套了⼀个个的对象(理解为是⼀个列表)
# 查询名字为lich的数据
# ret = models.User.objects.filter(username='lich').first() #结果是User对象,取出查询结果中的第⼀条数据
# ret = models.User.objects.filter(username='lich')
# print(ret)
# 删除的第⼀种⽅式:把id=1的⼈删除(先查询后删除)
# ret = models.User.objects.filter(id=1).delete() #把查询出来的所有结果删除
# print(ret)
# 删除的第⼆种⽅式:删除id=6的这个⼈(查询出对象,删除对象)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论