重修课程day57(Django的开始)

Posted 方杰0410

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重修课程day57(Django的开始)相关的知识,希望对你有一定的参考价值。

一 浏览器相关知识

 http:只有依赖一回,属于短链接,不会报错客户端的信息。

 浏览器相当于一个客户端,客户端的链接

 服务端:socket服务端,起服务监听客户端的请求。

import socket
sk=socket.socket()
sk.bind((\'192.168.11.38\',8888))
sk.listen(5)

def index():
    with open(\'轮播网页.html\',encoding=\'utf-8\')as f:
        ret=f.read()
        return ret
def login():
    with open(\'login.html\',encoding=\'utf-8\')as f:
        ret=f.read()
    import pymysql
    conn=pymysql.connect(
        host=\'127.0.0.1\',
        port=3306,
        user=\'root\',
        passwd=\'0410\',
        db=\'day46\'
    )
    cursor=conn.cursor()
    cursor.execute(\'select * from user\')
    user_list=cursor.fetchall()
    cursor.close()
    conn.close()
    res=\'\'
    for i in user_list:
        res += \'\'\'
        <tr>
            <td>{}</td>
            <td>{}</td>
            <td>{}</td>
        </tr>
        \'\'\'.format(i[0], i[1], i[2])
    tables= ret.replace(\'@@xx@@\',res)
    return tables




def info():
    return "这是个人信息"

info_index=[
    (\'/login/\',login),
    (\'/index/\',index),
    (\'/info/\',info)
]
while True:
    conn,addr=sk.accept()
    print(addr)
    data=conn.recv(8096)
    data3=str(data,encoding=\'utf-8\')
    data1=data3.split(\'\\r\\n\\r\\n\')[0]
    print(\'*\'*50)
    print(data1)
    data2=data1.split(\'\\r\\n\')[0].split(\' \')[1]
    print(data2)
    ingo_name=None
    for i in info_index:
        if data2==i[0]:
            ingo_name=i[1]
            break
    if ingo_name:
        response=ingo_name()
    else:
        response=\'404\'

    conn.send(b\'HTTP/1.1 200 0k\\r\\nContent-Type:text/html;charset=utf-8\\r\\n\\r\\n\')
    conn.send(response.encode(\'utf-8\'))
    conn.close()
View Code

二 框架的介绍

 tornado:模版都是人家写好的,我们只管拿来使用。

 Django:服务端可以自己写,其他的模版都是别人写好的。

 flask:服务端和模版渲染都是自己写的,函数的功能都是别人写好了的。

 所有的web框架叫做web应用服务器。

三 django的安装和使用

 安装:pip install django。

 创建项目:django-admin startproject 项目名

 手动创建:

 查看参数:django-admin。

 开启项目:python manage.py runserver

 使用命令创建app:atsrtapp app名

  配置文件的INSTALLED_APPS添加\'rbac.apps.RbacConfig\',

 响应格式:

  {

  "接收到的想要":回复

。。。。。

  }

 相关文件夹:

  manage.py:所有django命令,所有的django项目相关的都是基于manage这个文件实现的。

  settings.py:配置文件,客户端可以直接访问这里面的一些文件

  urls.py:函数功能,url内部给函数自动传入了一个参数,就是request参数。

   如果想要获取到url里面的内容,使用正则表达式里面的分组,将要获取的内容括起来,然后会被当作实参传入到函数功能里面去。

url配置:
	   注意:url:匹配的是url的路径部分
       import re
       re.findall("^articls/2004/$","articls/2004/asdsa")
	   
	无名分组:
       # url(r\'^articls/(\\d{4})/(\\d{2})$\', views.archive3,),  # archive2(request,2000,11)	     
	
    有名分组:
      # url(r\'^articls/(?P<y>\\d{4})/(?P<m>\\d{2})$\', views.archive4,), # archive2(request,y=2000,m=11) 

   blog分发:将一个大的urls文件进行分组,分成多个小的urls文件,然后再在大的urls文件里面调用这些小的urls文件。

小urls文件
from django.conf.urls import url, include
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r\'^articls/2004/$\', views.archive, ),  # 完全匹配 #  archive(request)
    url(r\'^articls/(?P<y>\\d{4})/(?P<m>\\d{2})$\', views.archive4, ),  # archive2(request,y=2000,m=11)
]


大urls文件
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r\'^admin/\', admin.site.urls),
    url(r\'^index/\', views.index),
    url(r\'^login.html/\', views.login,name="laogou"), # login(request)
    url(r\'^foo/\', views.foo), # login(request)

    ##############路由分发####################

    url(r\'^app01/\', include(\'app01.urls\')) ,  # /app01/articls/2004


]
View Code

  wsgi.py :socketserver相关,wsgi文件和django结合使用的,django是没有服务端的,而wsgi文件为django提供了一个服务端。

   wsgi文件是一种协议,是web网关接口,分别有两种:wsgiref和uwsgi。

    wsgiref是可以实现基本的,大多数用来调试的。

    uwsgi是用于企业的。

    wsgi导入的文件是:

from django.core.wsgi import get_wsgi_application

  app文件:project  :主要用于业务的分类,是整个项目下的一个程序

   主站,app:专门处理相关的业务,启动app的web命令:

python manage.py startapp web

   后台管理 app:启动app的backend命令:

python manage.py startapp backend

  models文件:主要是写web应用相关的内容。

四 使用

 views视图分为两大块:一个是请求对象,另一个是响应对象。

  请求对象request:代表所有请求的内容

   request.method:获取请求,请求的方法具体是什么

   request.POST.get(\'***\'):以什么途径发送的请求

   request.GET.get(‘***’):从url中获取具体的什么数据或者内容,在后端函数里面需要使用GET

   request.POST.getlist:同时可以获取多个值,所有的值都是在一个列表里面

   request.encoding:请求的格式

   request.path 和request.info:请求路径的内容,没有数据内容

   request.get_full_path:请求路径的内容,还有数据的内容

def archive(request):
    print(request.path)  # /app01/articls/2004/
    print(request.path_info)  # /app01/articls/2004/
    print(request.get_full_path())  # /app01/articls/2004/?a=1

   request.is_ajax:判断这次的请求是不是ajax请求

   还有request.COOKICS;request.session;request.path等

    GET:
			
		URL: 127.0.0.1:8000/class_list/?name=alex&age=18
		
		request.GET.get("name")			
		request.GET.get("age")	
		
	
	POST:
		
		<form class="form-horizontal" action="/add_class/" method="post">
			<div class="form-group">
				<label for="inputclassname" class="col-sm-2 control-label">班级名称</label>
				<div class="col-sm-10">
					<input name="class_name" type="text" class="form-control" id="inputclassname" placeholder="班级名称">
				</div>
			</div>
			<div class="form-group">
				<div class="col-sm-offset-2 col-sm-10">
					<button type="submit" class="btn btn-default">提交</button>
				</div>
			</div>
		</form>

 request.body:所有的请求数据都会在这里面。

from django.shortcuts import render,HttpResponse

# Create your views here.


def login(request):
    if request.is_ajax():
        print(request.body) # b\'{"user":"alex","pwd":"123"}\'
        # b\'user=alex&pwd=123&csrfmiddlewaretoken=PCLE4jNWOmLcmd5LiY1qrwTWQZLpZdSktwwwPswNKg7DhblKO6X1fBDkB05yoNMm\'
        print(request.POST) # {\'user\': [\'alex\'], \'pwd\': [\'123\'], \'csrfmiddlewaretoken\': [\'PCLE4jNWOmLcmd5LiY1qrwTWQZLpZdSktwwwPswNKg7DhblKO6X1fBDkB05yoNMm\']}
        print(request.GET)  # {}

        # user=request.POST.get("user")
        # pwd=request.POST.get("pwd")
        #
        # print(user,pwd)
        # print("=======")
        # import json
        # s=request.body.decode("utf8")
        # d=json.loads(s)
        # print(d.get("user"))
        # print(d.get("pwd"))
        return HttpResponse("OK")


    return render(request,"index.html")



def reg(request):
    if request.is_ajax():
        print(request.POST,"=======")

        return HttpResponse("OK")

    return render(request,"reg.html")
View Code

 request.FILES:文件上传的地方接收到的是一个文件对象,也就是一个文件句柄,直接.name就是文件名字。

from django.shortcuts import render,HttpResponse

# Create your views here.



def index(request):

    # #print(request.body)
    # print(request.POST) # <QueryDict: {\'csrfmiddlewaretoken\': [\'2Fq1vmv59yRSUxDwlkym3qmk5bNpfdHLGzbTgveW5sdjPvTvRsuXRv6IQc7yENBN\'], \'user\': [\'yuan\'], \'cFile\': [\'day76.txt\']}>
    # print(request.FILES)
    #
    # file_obj=request.FILES.get("cFile")
    # name=file_obj.name
    # print(name)  # day76.txt
    # import os
    #
    # from filePut import settings
    # path=os.path.join(settings.BASE_DIR,"app01","static",name)
    # with open(path,"wb") as f_write:
    #     for line in file_obj:
    #         f_write.write(line)





    return render(request,"index.html")



def indexAjax(request):
    print(request.body)
    print(request.POST)
    print(request.GET)

    # print(request.POST)
    # print(request.FILES)
    # file_obj=request.FILES.get("cFile")
    # name=file_obj.name
    # print(name)  # day76.txt
    # import os
    #
    # from filePut import settings
    # path=os.path.join(settings.BASE_DIR,"app01","static",name)
    # with open(path,"wb") as f_write:
    #     for line in file_obj:
    #         f_write.write(line)

    return HttpResponse("123421")
View Code

 新手三件套:

  导入:from django.shortcuts import

   HttpResponse:http的响应,里面只能够方字符串

   render:渲染,一次请求一次响应。每请求一次就会被渲染。

    render(request, \'html文件\')

    render(request,"html文件",{"替换的内容":值})

    render(request,"html文件",locals())   :局部的变量都可以在HTML文件里面使用

   redirect:跳转页面,重定向这一次请求,重定向时,需要多发送一次请求。

			以登录为例:
			    第一次请求:
			        请求url: http://127.0.0.1:8000/login.html/      GET     无请求数据
					login.html/-------> views.login------>login()
					响应到一个login.html页面
					
				第二次请求:
                     请求url: http://127.0.0.1:8000/login.html/     POST    有请求数据  {"user":"alex","pwd":"123"}
  					 login.html/-------> views.login------>login()
					 响应的return redirect("/index/")到浏览器,通知浏览器再发送请求:"/index/"
					 
					 请求url: http://127.0.0.1:8000/index/       get请求   没有数据
					 index/ --->url(r\'^index/\', views.index),---->index()
					 
					 响应一个index.html
from django.conf.urls import url
from django.contrib import admin
from django.shortcuts import render,redirect



def mysql():
    import pymysql
    user_dic = {}
    conn=pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="0410", db="day43", charset="utf8")
    cursor=conn.cursor()
    cursor.execute(\'select name,password from user\')
    user_list = cursor.fetchall()
    cursor.close()
    conn.close()
    for user in user_list:
        user_dic[user[0]]=user[1]
    return user_dic


def login(request):
    if request.method==\'GET\':
        return render(request,\'登陆界面.html\')
    else:
        user_dic=mysql()
        for user in user_dic:
            if request.POST.get(\'user\')==user and request.POST.get(\'passwd\')==user_dic[user] and request.POST.get(\'pwd\')==user_dic[user]:
                return redirect(\'http://www.xiaohuar.com/hua/\')
            elif request.POST.get(\'user\')==user and request.POST.get(\'passwd\')==user_dic[user] and request.POST.get(\'pwd\')!=user_dic[user]:
                return render(request, \'登陆界面.html\', {\'error_msg\': \'密码输入不一致\'})
        else:
            return render(request,\'登陆界面.html\',{\'error_msg\':\'用户名和密码错误\'})

urlpatterns = [
    url(r\'^admin/\', admin.site.urls),
    url(r\'^login/\',login)
]
View Code

 http就是基于一次请求一次响应的。

 模版语言:

  格式1:

   {% for i in **%}

    {{x}}

   {% endfor %}

  格式2:

   {{ 变量名 }}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .c1 {
            width: 100%;
            height: 50px;
            background-color:#DDDDDD;
            opacity: 0.3;
        }

        .c4{
            width:80%;
            height:50px;
            background-color:#DDDDDD;
            margin-left: 10%;
        }

        .c7{
            width: 100px;
            height: 50px;
            float:left;
        }

        .c8{
            width: 80px;
            height: 50px;
            float:right;
        }

        .c9{
            width: 120px;
            height: 50px;
            float:right;
        }

        .c10{
            width: 80px;
            height: 50px;
            float:right;
        }

        .c11{
            width: 80px;
            height: 50px;
            float:right;
        }

         .c12{
             width: 50px;
             height: 50px;
             float:right;
        }

        .s1{
            line-height:50px;
            text-align: center;
            color:#1F1E1E;
        }

        .c2{
            width:100%;
            height: 60px;
            background-color: #ffffff;
            margin-top: 20px;
        }

        .c5{
            width: 80%;
            height: 60px;
            background-color: #FFFFFF;
            margin-left: 10%;
        }
        .c3{
            width:100%;
            height:auto;

        }

        .c6{
            width: 80%;
            height: auto;
            margin-left: 10%;
        }

        .d1{
            width: 500px;
            height: 400px;
            float: left;
            margin-top: 50px;
        }

        .d3{
            width: 500px;
            height: 50px;
            margin-top:60px;
        }

        .s2{
            font-weight:600;
            font-size:30px;
            color: #2e2e2e;
            line-height:50px;
            margin-left: 70px;

        }

        .p1{
            margin-left: 120px;
        }

        .p2{
            margin-left: 104px;
        }


        .i2{
            margin-left: 15px;
        }

        .s3{
            color:red;
        }

        .p4{
            margin-left: 150px;
        }

        .s4{
            color:#0000CC;
        }

        .i3{
            font-size: 14px;
        }


        .p5{
            margin-left: 200px;
        }

        .i5{
            font-size: 10px;
             background-color:red;
        }

        .d2{
            width: 314px;
            height:400px;
            float: right;
            margin-top: 50px;
        }

        .p6{
            margin-left:30px;
        }


        .p7{
            margin-top: 50px;
        }

    </style>
</head>
<body>

<div class="c1">
    <div class="c4">
        <div class="c7"><span class="s1">*收藏网址</span></div>
        <div class="c8"><span class="s1">客户服务</span></div>
        <div class="c9"><span class="s1">VIP会员俱乐部</span></div>
        <div class="c10"><span class="s1">我的订单</span></div>
        <div class="c11"><span class="s1">免费注册</span></div>
        <div class="c12"><span class="s1">登陆</span></div>
    </div>
</div>
<div class="c2">
    <div class="c5"><img src="111.png" alt="悟空"></div>
</div>
<div class="c3">
    <div class="c6">
        

以上是关于重修课程day57(Django的开始)的主要内容,如果未能解决你的问题,请参考以下文章

重修课程day62(django之中间件)

重修课程day60(django之form组件)

重修课程day59(django之http)

重修课程day26(面向对象6之反射,内置函数和常用模块)

重修课程day31(网络编程五之进程二)

重修课程day9(函数之有参函数)