重修课程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()
二 框架的介绍
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 ]
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")
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")
新手三件套:
导入: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)
]
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的开始)的主要内容,如果未能解决你的问题,请参考以下文章