Python Web框架【Django框架第一篇基础】

Django框架第一篇基础【DjangoMTV模式】

 
 
老师博客【www.cnblogs.com/yuanchenqi/articles/6811632.html】
同学博客:http://www.cnblogs.com/haiyan123/p/7701412.html
Django官网: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),
View Code
    
在视图参数里;即使参数位置变化也能取到值
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文件
<wiz_code_mirror>
 
 
 
 
 
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login,name="LOGIN"),
 
 
]
 
 
login.html文件
<wiz_code_mirror>
 
 
 
 
 
<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文件
<wiz_code_mirror>
 
 
 
 
 
 
 
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文件
<wiz_code_mirror>
 
 
 
 
 
 
 
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对象
属性:
<wiz_code_mirror>
 
 
 
 
 
 
 
'''
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文件
<wiz_code_mirror>
 
 
 
 
 
 
 
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文件
<wiz_code_mirror>
 
 
 
 
 
 
 
<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文件
<wiz_code_mirror>
 
 
 
 
 
 
 
urlpatterns = [
    url(r'^login/', views.login,name="LOGIN"),
    url(r'^back',views.back),
]
 
 
views文件【这里需要注意locals】
<wiz_code_mirror>
 
 
 
 
 
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文件
<wiz_code_mirror>
 
 
 
 
 
 
 
<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文件
<wiz_code_mirror>
 
 
 
 
 
 
 
<body>
    <h1>hello {{ name }}</h1>
</body>
 
 
思路:
  1. 编写urls文件:http://127.0.0.1:8800/login和http://127.0.0.1:8800/back
  2. 编写views视图文件:编写登录函数login(req);登录验证;和登录成功跳转url【return redirect("/back")】
  3. 编写views视图文件:编写用户界面函数back(req);直接返回用户界面页面back.html;locals表示当前函数内的所有变量;在back文件里直接写{{name}}就可以
 
 
 
 
 
 
 
######################_______________分割线_______________#######################
三、Template【存放.html文件】
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
######################_______________分割线_______________#######################
四、Models【数据库操作】
ORM
 
 
4.1 ORM表模型【models文件】
<wiz_code_mirror>
 
 
 
 
 
 
 
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【这个是总的】
<wiz_code_mirror>
 
 
 
 
 
 
 
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文件
<wiz_code_mirror>
 
 
 
 
 
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文件
<wiz_code_mirror>
 
 
 
 
 
<!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>
 
 
下面是练习的截图
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/zy19880115/p/9024190.html
今日推荐