Python Django框架

官网:ggDownload Django | Django

00cab9930bd74aefbb741f6a7136d78b.png在终端输入命令下载Django

Django项目结构:

        安装完成后,终端会有django-admin命令

django-admin startproject 项目名  //可创建对应的项目文件夹

例如:django-admin startproject mysite1

启动:

1,终端进入mysite1文件夹

cd mysite1

2,进入项目文件夹后,执行

python manage.py runserver  //启动服务,该启动,默认端口为8000

若8000端口无法访问,可以自定义端口(端口必须是未占用的)
python manage.py runserver 5000

3,浏览器访问http://127.0.0.1:8000 可看到Django界面

7ac0f9c0a5714a12807fbb8e28ba2a16.png

关闭服务:

在终端中执行 Crtl+c 可以关闭服务器

结构分析: 打开mysite1文件

d007f7612c8543aaab13804f5f888ff9.png

db.sqlite3在第一次执行创建文件时就默认被创建出来了 ,为默认的Django的数据库文件

manage.py:包含项目管理的子命令

python manage.py runserver //启动服务
python manage.py startapp //创建应用
python manage.py migrate  //数据库迁移

等

项目同名文件夹:mysite1/mysite1

  • _init_: python包的初始化文件
  • wsgi.py: WEB服务网关的配置文件
  • urls.py: 项目的主路由器配置 - HTTP请求进入Django时首先调用此文件
  • settings.py: 项目的配置文件,包含项目启动时需要配置的文件

settings.py :

BASE_DIR=''         //为项目绝对路径
DEBUG = True
//为启动模式
//True 调试模式
//False 上线模式
ALLOWED_HOSTS = []  //请求host文件

DEBUG=True时,默认为127.0.0.1和localhost
ROOT_URLCONF = 'mysite1.urls'   //django的主路由配置

LANGUAGE_CODE = 'en-us'    //为页面语言,zh-Hans为中文

TIME_ZONE = 'UTC'        //为时间,Asia/Shanghai为中国时间

URL和视图函数

        Django如何处理url呢?

44437a067ca3419b9e02e55bca776b12.png

         urls.py:9cdc1c08386047e687ab158028766159.png

urlpattern为数组,调用path指明当前可服务的地址有哪些

 admin/,page/2003/,page/2004/,为路由地址,表示网站可以接这三个地址,其余不在这数组的全报404

例如:#http://127.0.0.1:8000/page/2004/

path的第二个参数为核心,调用视图函数对应的路由路径返回响应的Response

视图函数:

daa964bc775c48e0a010c4d283f7a02a.png

request为必须的,将请求传到试图函数上

视图函数的创建:

#file 在项目同名文件夹下/views.py
from django.http import HttpResponse
def xxx_view(request):
    html='<h>这是第一个页面<\h>'
    return HttpResponse(html)

 并在urls.py文件中导入views.py的文件ea5f5599e66e4d6f9a2c578e03e62afa.png

 访问页面查看

8c15990bbcf8479cb78114a63082f4a4.png

路由配置:

        路由配置 - path

  • path()函数
  • 导入 from django.urls import path
  • 语法 path(route,views,name=None)
  • 参数:
    • 1,route :字符串类型,匹配的请求路径
    • 2,views:指定路径所对应的视图函数名称
    • 3,name:为地址起别名
#urls.py

from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('path/1',views.page_1_view),
    path('path/2',views.page_2_view)
]

#views.py

from django.http import HttpResponse

def page_1_view(request):
    html='<h1>这是第一面</h1>'
    return HttpResponse(html)

def page_2_view(request):
    html='<h1>这是第二面/h1>'
    return HttpResponse(html)

path转换器:

7dab363c24a44e728d2fe7c007d876a2.png

<int:page>,里的page为自定义形参,将page传入到视图函数中,视图函数要准备一个与自定义相同的形参即p age

b0f8c867bc9a48909a55c4e6d2e23c37.png

小练习:计算器

定义一个路由格式为http://127.0.0.1:8000/整数/操作字符串[add,sub,mul]/整数

例如:127.0.0.1:8000/100/add/100

页面显示:300

#urls.py
from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('<int:n>/<str:use>/<int:m>',views.page_view)
]

#views.py
def page_view(request,n,use,m):
    if username not in ['add','sum','mul']:
        html='no'
        return HttpResponse(html)
    if username == 'add':
        return HttpResponse('%s'%(n+m))
    if username == 'sum':
        return HttpResponse('%s'%(n-m))
    if username == 'mul':
        return HttpResponse('%s'%(n-m))

re_path函数:

78c39173005948049bad5eca1a0db20a.png

例如:
path(r'^(?P<x>\d{1,2})/(?P<op>\w+/(?P<y>\d{1,2)',views.cal2_views)

匹配 1-2位的数组/字母/1-2位的数组

\d{1,2} //匹配一到两位的数字
\w+     //匹配所有字母

请求和响应:

Django中的请求;

  • 请求在Django中就是视图函数的第一个参数,即HttpRequest对象
  • Django接受到http协议的请求后,会根据请求数据报文创建Httprequest对象
  • Httprequest对象通过属性描述了请求的所有相关内容
path_info            //URL字符串
method                //字符串,表示http请求方法,常值用‘GET’,’POST‘
GET                  //QueryDict查询字典的对象,包含get请求的所有数据
POST                 //QueryDict查询字典的对象,包含POST请求的所有数据
FILES                //类似于字典的对象,包含所有上传文件的信息
COOKIE                //python字典,包含所有cookie,键值都为字符串
session                //类似于字典对象,表示当前会话
body                //请求体的内容(POST或PUT)
scheme                //请求协议
request.get_full_path()        //请求的完整路径
request.META            //请求中的元数据(消息头)
request.META['REMOTE_ADDR']        //客户端ip地址
        

 例如:

#urls.py

from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('path/<int:pg>/<str:username>/<int:pg1>',views.page_view),
    path('test',views.test)
]

#views.py

from django.http import HttpResponse
def test(request):
    print('path info is',request.path_info)
    print('method is',request.method)
    print('GET is',request.GET)
    return HttpResponse('test ok')  //页面响应‘test ok’

去终端中查看path_info,method,GET

 

GET和POST

无论是GET还是POST,一律都用视图函数接收,通过request.method区分具体的请求方式

GET处理:

POST请求:

#urls.py

from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('path/<int:pg>/<str:username>/<int:pg1>',views.page_view),
    path('test',views.test),
    path('test_post',views.test)
]

#views.py

from django.http import HttpResponse

POST_FORM='''
<form method='post' action='/test_post'>
    <input type='text' name='usname'>
    <input type='submit' value='提交'>
</form>
'''        #定义一个全局变量的form表单

def test(request):
    print('path info is',request.path_info)
    print('method is',request.method)
    print('GET is',request.GET)
    if request.method=='GET':
        print('a is',request.GET['a'])
        print('a is',request.GET.getlist('a'))
        print(request.GET.get('c','no c'))
        return HttpResponse(POST_FORM)    #以get方式参数为a提交的,返回form表单
    elif request.method=='POST':
        print('usname is',request.POST['usname'])    #接受post提交的usname的值
        
        return HttpResponse('post is ok')
    
    return HttpResponse('text ok')

 

但访问时报错

这是Django为了防范CSRF漏洞所制定的规则,如果未按规则走提交的请求将提交不了

所以前期,我们需要在setting.py文件中手动关闭中间介

模板层:

        先来了解Django的设计层(MTV):

视图层将 收到的数据打包送入 模板层 后返回给 html页面

模板的创建:

模板的加载方式:

#views.py
from django.http import HttpResponse
def template_s(html):
    from django.template import loader
    t = loader.get_template('test_html.html')
    html = t.render()
    return HttpResponse(html)

#urls.py中写入对应的路径
path('test_html',views.template_s)

#在templates文件夹下创建html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>template</title>
</head>
<body>
    <h1>模板层~~~~~~~</h1>
</body>
</html>


 访问模板的路径

render函数中的第三项字典数据可有可无

模板与视图的交互:

这里将会使用到 render 的第三个参数 字典数据

在模板中所可以传递的参数:

str - 字符串        int - 整形

list - 数组           tuple - 元组

dict - 字典          func - 方法

obj - 实例化的对象

在模板中使用变量:

{{变量名}}
{{变量名.index}}
{{变量名.key}}
{{对象.方法}}
{{函数名{}}

例子:

在urls.py中:

def test_template:
   from django.template import loader
   dct={}
   dct['int']=18,
   dct['str']='haohao',
   dct['list']=['yom','Tom','Hao'],
   dct['dict']=['a':'ok','b':'yes'],
   dct['func']=say_hai,        #传入一个函数
   dct['class_obj']=Dog(),    #传一个类的实力胡对象
   return render(request,'test_html',dct)

def sya_hai:
    return 'hhh'

class Dog:
    def say(self):
    return 'hello'
    

 在test_template.html

<h1>int is {{int}}</h1>
<h2>str is {{str}}</h2>
<h3>list is {{list}}</h3>    //返回整个列表

<h3>list[0] is {{list.0}}</h3>    //返回列表中索引为0的值

<h4>dict is {{dct}}</h4>    //返回整个字典

<h5>dict['a'] is {{dct.a}}</h5>   //返回字典中键对应的值
<h6>func is {{func}}</h6>   //传入函数返回值
<h7>obj is {{class_obj.say}}</h7>      //传入实例化对象的返回值

访问页面:

模板标签:

作用:将服务端的一些功能嵌入到模板中,例如流程控制等

语法:

{% 标签 %}
......
{% 结束标签 %}
#在html中写入代码

{% if x>10 %}
yes is ok
{% else %}
no no no
{% endif %}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值