Python Web框架Django框架第一篇基础
Posted zy19880115
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python Web框架Django框架第一篇基础相关的知识,希望对你有一定的参考价值。
Django框架第一篇基础【DjangoMTV模式】
老师博客【www.cnblogs.com/yuanchenqi/articles/6811632.html】
同学博客:http://www.cnblogs.com/haiyan123/p/7701412.htmlDjango官网:https://www.djangoproject.com/download/
一、安装Django
DjangoMTV模式
Django的MTV模式本质是各组件之间为了保持松耦合关系,Django的MTV分别代表:
Model(模型):负责业务对象与数据库的对象(ORM)
Template(模版):负责如何把页面展示给用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
windows7
1.1、通过cmd命令行到python-3.5.4\\Scripts目录下,执行“pip3.5.exe install Django”命令【注意版本】
D:\\办公软件\\python-3.5.4\\Scripts>pip3 install Django==1.11.13
删除命令
C:\\Users\\Administrator>pip uninstall Django
1.2、将django命令加入环境变量
【【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【Python安装目录追加到变值值中,用 ; 分割】】
D:\\办公软件\\python-3.5.4;D:\\办公软件\\python-3.5.4\\Scripts
验证是否安装成功
#!/usr/bin/env python # -*- coding:utf-8 -*- import django print(django.get_version()) D:\\办公软件\\python-3.5.4\\python.exe E:/Python/Python自动化开发/day15/Django/a.py 1.11.13
二、Django基本命令
2.1、使用命令创建一个Django项目
E:\\Django_project>django-admin startproject mysite
当前目录下会生成mysite的工程,目录结构如下:
- manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等。
- settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
- urls.py ----- 负责把URL模式映射到应用程序。
- wsgi.py----类似于nginx的功能模块
2.2、在mysite目录下创建应用,比如blog:
E:\\Django_project\\mysite>python manage.py startapp blog
- models.py----配置和数据库有关的操作
- views.py----视图模块;所有的视图函数
2.3、使用pycharm创建django项目
2.4、配置文件
1】在urls.py文件里加入和视图的对应关系
from django.contrib import admin from django.urls import path #应用blog下的views文件 from blog import views urlpatterns = [ url(r‘^admin/‘, admin.site.urls), #对应关系;调用views里的index函数【首页】【http://127.0.0.1:8800/blog/】 url(r‘^blog/‘, views.index), ]
2】在视图文件views.py里编写和urls.py里对应的首页信息;
from django.shortcuts import render,HttpResponse # Create your views here. #必须加参数;一般都用request【是请求信息对象】;HttpResponse【是响应信息对象】 def index(request): #返回一个字符串 #return HttpResponse("<h1>welcome python zhangyu</h1>") #返回页面;第一次参数是request;第二个参数是在templates目录下的文件;不需要导入;直接写就可以 return render(request,"index.html")
2.5、在pycharm启动django
E:\\Python\\Python自动化开发\\day15\\Django\\Mysite>python manage.py runserver 8800
2.6、访问http://127.0.0.1:8800/
http://127.0.0.1:8800/blog/
#######################################################################
######################_______________分割线_______________#######################
#######################################################################
Django需要掌握四部分
一、URL控制
二、views【视图函数】
三、Template【存放.html文件】
四、Models【数据库操作】
urls===>views===>templates===>mdoels
一、URL控制
1.1【url和视图函数的映射表】
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表。你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码
""" urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 参数说明: 一个正则表达式字符串 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串 可选的要传递给视图函数的默认参数(字典形式) 一个可选的name参数 """
urlpatterns = [ url(r‘^admin/‘, admin.site.urls), #对应关系;调用views里的index函数【首页】【http://127.0.0.1:8800/blog/】 url(r‘^blog/‘, views.index), url(r‘^articles/2003/$‘, views.special_case_2003), #有括号的话就是单一个参数;要在视图views.year_archive里加参数 url(r‘^articles/([0-9]{4})/$‘, views.year_archive), url(r‘^articles/([0-9]{4})/([0-9]{2})/$‘, views.month_archive), url(r‘^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$‘, views.article_detail), ] 1 一旦匹配成功则不再继续 2 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。 3 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。 4 每个正则表达式前面的‘r‘ 是可选的但是建议加上。 一些请求的例子: /articles/2005/3/ 不匹配任何URL 模式,因为列表中的第三个模式要求月份应该是两个数字。 /articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,第一个会首先测试是否匹配。 /articles/2005/03/ 请求将匹配列表中的第三个模式。Django 将调用函数 views.month_archive(request, ‘2005‘, ‘03‘)。
1.2【有名分组(named group)】
上面的示例使用简单的、没有命名的正则表达式组(通过圆括号)来捕获URL 中的值并以位置 参数传递给视图。在更高级的用法中,可以使用命名的正则表达式组来捕获URL 中的值并以关键字 参数传递给视图。
在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式。
关键字参数也对应 #有括号的话就是单一个参数;要在视图views.year_archive里加参数 url(r‘^articles/(?P<year>[0-9]{4})/$‘, views.year_archive), url(r‘^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$‘, views.month_archive), url(r‘^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/([0-9]+)/$‘, views.article_detail), 在视图参数里;即使参数位置变化也能取到值 def article_detail(request,year,month,id):
1.3 【URLconf 在什么上查找】
URLconf 在请求的URL 上查找,将它当做一个普通的Python 字符串。不包括GET和POST参数以及域名。
例如,http://www.example.com/myapp/ 请求中,URLconf 将查找myapp/。
在http://www.example.com/myapp/?page=3 请求中,URLconf 仍将查找myapp/。
URLconf 不检查请求的方法。换句话讲,所有的请求方法 —— 同一个URL的POST、GET、HEAD等等 —— 都将路由到相同的函数。
1.4 【捕获的参数永远是字符串】
每个捕获的参数都作为一个普通的Python 字符串传递给视图,无论正则表达式使用的是什么匹配方式。例如,下面这行URLconf 中:
url(r‘^articles/(?P<year>[0-9]{4})/$‘, views.year_archive),
views.year_archive() 的year 参数将是一个字符串
1.5【URL分发】【在自己的项目独立建urls文件】
分出去的URL;访问时;要加项目名http://127.0.0.1:8800/blog/articles/2003/
Django接收post请求时会报错;需要注释settings.py文件里的这行
‘django.middleware.csrf.CsrfViewMiddleware‘,
1.6【别名name=‘INDEX‘】
设置好别名后;URL怎么改都不会对项目有影响
urls.py文件
urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^login/‘, views.login,name="LOGIN"), ]
login.html文件
<h1>登录页面</h1> {# <form action="/index/" method="post">#} <form action="{% url ‘LOGIN‘ %}" method="post"> 用户名:<p><input type="text" name="username"></p> 密码:<p><input type="password" name="pwd"></p> <input type="submit" value="submit"> </form> </body>
######################_______________分割线_______________#######################
二、views【视图函数】
一个视图函数,或者简短来说叫做视图,是一个简单的Python函数,它接受web请求,并且返回web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你的Python目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了能够把代码放在某个地方,惯例是把视图放在叫做views.py的文件中,然后把它放到你的项目或者应用目录里。
请求对象:request【每个视图函数里一定有request参数;封装所有数据对象】
响应对象:HttpResponse【每次return的值一定是HttpResponse的对象】
2.1、访问url返回时间实例
urls文件
from django.conf.urls import url,include from django.contrib import admin #应用blog下的views文件 from blog import views urlpatterns = [ url(r‘^timer/‘,views.timer), ]
views文件
import datetime def timer(req): #当前时间 t=datetime.datetime.now() #返回当前时间 return HttpResponse("<h1>Current time:%s</h1>" %t)
让我们逐行阅读上面的代码:
- 首先,我们从 django.http模块导入了HttpResponse类,以及Python的datetime库。
- 接着,我们定义了timer函数。它是一个视图函数。每个视图函数都应接收HttpRequest对象作为第一个参数,一般叫做request。
- 注意视图函数的名称并不重要;不需要用一个统一的命名方式来命名,以便让Django识别它。我们将其命名为timer,是因为这个名称能够精确地反映出它的功能。
- 这个视图会返回一个HttpResponse对象,其中包含生成的响应。每个视图函数都要返回HttpResponse对象
‘‘‘
http请求-响应过程中有两个核心对象:
http请求对象:HttpRequest
http响应响应:HttpResponse
所在位置:django.http
‘‘‘
HttpRequest对象
属性:
‘‘‘ path: 请求页面的全路径,不包括域名 method: 请求中使用的HTTP方法的字符串表示。全大写表示。例如 if req.method=="GET": do_something() elif req.method=="POST": do_something_else() GET: 包含所有HTTP GET参数的类字典对象 POST: 包含所有HTTP POST参数的类字典对象 COOKIES: 包含所有cookies的标准Python字典对象;keys和values都是字符串。 FILES: 包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中 name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys: filename: 上传文件名,用字符串表示 content_type: 上传文件的Content Type content: 上传文件的原始内容 user: 是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前 没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你 可以通过user的is_authenticated()方法来辨别用户是否登陆: if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware 时该属性才可用 session: 唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。 ‘‘‘
2.2、render函数
如何把后端的变量嵌套进入前端页面
在html页面用{{}}标记;里面填写render里{}的值
大致流程
1、render找到html文件;并设置变量{}
2、在html文件里{{}}填写实战的变量
3、渲染完后返回给return
render方法有两个功能;1、返回一个也没;2、模版语法:将变量嵌入到html页面中
views文件
import datetime def timer(req): #当前时间 t=datetime.datetime.now() #返回当前时间 #return HttpResponse("<h1>Current time:%s</h1>" %t) #返回结果使用render渲染; """ 1、render会找到timer.html模版文件; 2、在timer.html文件里找到{{}}在里面写Time; 如:<h1>Current time: {{ Time }}</h1> """ return render(req,"timer.html",{"Time":t})
html文件
<body> {# 把后端的变量嵌套进入前端页面#} <h1>Current time: {{ Time }}</h1> </body>
render函数
- ---------------render(request, template_name[, context])
- 结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
- 参数:
- request: 用于生成响应的请求对象。
- template_name:要使用的模板的完整名称,可选的参数
- context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
- content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。
- status:响应的状态码。默认为200。
2.3、重定向redirect函数
需要引用redirect模块
以登录网页为例子
urls文件
urlpatterns = [ url(r‘^login/‘, views.login,name="LOGIN"), url(r‘^back‘,views.back), ]
views文件【这里需要注意locals】
def login(req): if req.method==‘POST‘: username=req.POST.get(‘username‘,None) password=req.POST.get(‘pwd‘,None) if username==‘alex‘ and password==‘123‘: #return HttpResponse("登陆成功") #如果登录成功转到back的URL return redirect("/back") return render(req,‘login.html‘) def back(req): name="alex" #locals表示当前函数内的所有变量;在back文件里直接写{{name}}就可以 return render(req,"back.html",locals())
login.html文件
<body> <h1>登录页面</h1> {# <form action="/index/" method="post">#} <form action="{% url ‘LOGIN‘ %}" method="post"> 用户名:<p><input type="text" name="username"></p> 密码:<p><input type="password" name="pwd"></p> <input type="submit" value="submit"> </form> </body>
back.html文件
<body> <h1>hello {{ name }}</h1> </body>
思路:
- 编写urls文件:http://127.0.0.1:8800/login和http://127.0.0.1:8800/back
- 编写views视图文件:编写登录函数login(req);登录验证;和登录成功跳转url【return redirect("/back")】
- 编写views视图文件:编写用户界面函数back(req);直接返回用户界面页面back.html;locals表示当前函数内的所有变量;在back文件里直接写{{name}}就可以
######################_______________分割线_______________#######################
三、Template【存放.html文件】
这部分我都是看老师或者同学的博客;第一天学;这块有点模糊;
######################_______________分割线_______________#######################
四、Models【数据库操作】
4.1 ORM表模型【models文件】
from django.db import models # Create your models here. #ORM:对象关系映射【python的类-----数据表 # python的类实例-----表的记录 # python的类属性-----表的字段 #创建Books表 class Books(models.Model): #主键 #nid=models.IntegerField(primary_key=True) #标题-字符串-32字节 title=models.CharField(max_length=32) #作者 author=models.CharField(max_length=32) #价格 price=models.FloatField() #出版时间 pub_date=models.DateField()
E:\\Python\\Python自动化开发\\day15\\Django\\Mysite>python manage.py makemigrations
Migrations for ‘blog‘:
blog\\migrations\\0001_initial.py
- Create model Books
E:\\Python\\Python自动化开发\\day15\\Django\\Mysite>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, blog, contenttypes, sessions
注释【
在你改动了 model.py的内容之后执行下面的命令:
python manger.py makemigrations
相当于 在该app下建立 migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py, 但是这个改动还没有作用到数据库文件
你可以手动打开这个文件,看看里面是什么
在此之后执行命令
python manager.py migrate
将该改动作用到数据库文件,比如产生table之类
】
4.2 ORM之增(create,save)、删(delete)、改(update和save)、查(filter,value)、
在urls.py里添加url【这个是总的】
from django.conf.urls import url,include from django.contrib import admin #应用blog下的views文件 from blog import views urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^login/‘, views.login,name="LOGIN"), #对应关系;调用views里的index函数【首页】【http://127.0.0.1:8800/blog/】 url(r‘^blog/‘, include(‘blog.urls‘)), url(r‘^timer/‘,views.timer), url(r‘^back‘,views.back),#查看在这里做的 url(r‘^add_books‘,views.add_books),#增加 url(r‘^delete_books‘,views.delete_books),#删除 url(r‘^edit_books‘,views.edit_books),#修改 ]
views.py文件
from django.shortcuts import render,HttpResponse,redirect # Create your views here. #必须加参数;一般都用request【是请求信息对象】;HttpResponse【是响应信息对象】 def index(request): #返回一个字符串 #return HttpResponse("<h1>welcome python zhangyu</h1>") #返回页面;第一次参数是request;第二个参数是在templates目录下的文件;不需要导入;直接写就可以 return render(request,"index.html") def login(req): if req.method==‘POST‘: username=req.POST.get(‘username‘,None) password=req.POST.get(‘pwd‘,None) if username==‘alex‘ and password==‘123‘: #return HttpResponse("登陆成功") #如果登录成功转到back的URL return redirect("/back") return render(req,‘login.html‘) #引用models模块 from blog.models import * #ORM-查看数据 def back(req): #这里要注意在html文件里怎么去obg_list的值 obg_list=Books.objects.all() #locals表示当前函数内的所有变量;在back文件里直接写{{name}}就可以 return render(req,"back.html",locals()) #ORM-增加数据 def add_books(request): #创建记录的两种方式:1/create 2/save #注意:pub_date是Datetime数据类型;格式固定【2018-05-10】 #Books.objects.create(title="python",author="egon",price=89,pub_date="2018-05-10") b=Books(title="JAVA",author="zhangyu",price=11,pub_date="2111-11-11") #调用save;保存到数据库 b.save() #return HttpResponse("添加成功!!!") return redirect("/back/") #ORM-删除数据 def delete_books(req): #取/delete_books?id=3里面的id id=req.GET.get("id") #filter帅选过滤;然后删除 Books.objects.filter(id=id).delete() return redirect("/back/") #ORM-编辑数据 def edit_books(req): id = req.GET.get("id") #filter和get都是筛选条件;filter取到的是集合对象;get是单一对象 # b=Books.objects.get(id=id) # b.price=100 # b.save()#效率低 Books.objects.filter(id=id).update(price=100) return redirect("/back/")
back.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>hello {{ name }}</h1> <h1>书籍管理工具</h1> {#注意这里的变量;深度变量的查找(万能的句点号)#} {% for obj in obg_list %} <p>书名{{ obj.title }} 作者{{ obj.author }} 日期{{ obj.pub_date }} 价格{{ obj.price }} <a href="/delete_books/?{{ obj.id }}">删除</a> <a href="/edit_books/?id=5">编辑</a></p> {% endfor %} <a href="/add_books/">添加</a> </body> </html>
下面是练习的截图
以上是关于Python Web框架Django框架第一篇基础的主要内容,如果未能解决你的问题,请参考以下文章