天天看点

Python全栈 Web(Django框架、HttpRequest,csrf跨域攻击)

Djanog 的ORM

    自定义查询对象 - objects

        声明一个类 EntryManager 继承自models.Manager

        允许在EntryManager 的类中添加自定义函数

        class EntryManager(models.Manager):

            def 函数名(self, 自定义参数列表):

                ...

                return ...

        使用EntryManager 来覆盖 Models类中原有的objects

#自定义AuthorManager类,用于覆盖Author实体类中的objects
class AuthorManager(models.Manager):
  def age_lt(self,age):
    return self.filter(age__lt=age)           

        class Entry(models.Model):

            objects = EntryManager()

            name = models.CharField()

def titleCount_views(request):
  # count = Book.objects.title_count('老王')
  # return HttpResponse('包含老王的书籍的数量为%d' % count)

  authors = Author.objects.age_lt(45)
  for author in authors:
    print(author.name,author.age)
  return HttpResponse("Query OK")           

HttpRequest 请求:

    什么是HttpRequest  在Django中就是请求对象的封装体现  里面封装了

    请求过程中的所有信息 在Django中HttpRequest被封装成了

    request对象  被封装到请求处理视图中作为参数,在调用个视图时自动传入

    HttpRequest中的主要内容:

        request.scheme      请求的协议

        request.body        请求主题

        request.path        请求具体资源路径

        request.get_host()  请求的主机地址或域名

        request.method      请求方法

        request.GET         封装了get请求方式所提交的数据

        request.POST        封装了POST请求方式所提交的数据

        request.COOKIES     封装了cookies中所有数据

        request.META        封装了请求的元数据

        request.META.HTTP_REFERER

                封装了请求的源地址

    获取请求数据:

        GET请求方式

            request.GET["名称"]

        POST请求方式

            request.POST["名称"]

            CSRF  cross-site request forgery

                   跨站点      请求     伪装

            解决方案:

                1.如果想通过CSRF通过CSRF验证  则需要在表单中的第一行增加

                  标签:{% csrf_token %}

<form action="/03-post/" method="post">
  <!-- 主要用于在服务器端通过 csrf 验证的 -->
  {% csrf_token %}
  <p>
    姓名:<input type="text" name="uname">
  </p>           

                2.

                  删除settings.py 中MIDDLEWRE中删除中间件

Python全栈 Web(Django框架、HttpRequest,csrf跨域攻击)

                3.在处理函数上增加装饰器

                  @csrf_protect

                  表示受保护的请求

使用forms模块处理表单

    forms 模块的作用

        通过forms模块 允许将表单与class相结合

        允许通过 class生成表单

    使用froms模块

        1.创建一个forms.py模块

        2.打入django的forms

          from django import forms

        3.创建class

          一个class对应一个表单

          class UserForm(forms.Form):

            ...

        4.在class中创建属性

          一个属性到表单中会对应生成一个控件

from django import forms

# 为topic控件初始化数据
TOPIC_CHOICE = (
  ('1','好评'),
  ('2','中评'),
  ('3','差评'),
)

#表示评论内容的表单控件们
#控件1 - 评论标题 - 文本框
#控件2 - Email - Email框
#控件3 - 评论内容 - Textarea
#控件4 - 评论级别 - Select
#控件5 - 是否保存 - Checkbox
class RemarkForm(forms.Form):
  # subject - input type='text'
  # label 表示的是控件前的文本
  subject=forms.CharField(label='标题')
  # email - input type='email'
  email = forms.EmailField(label='邮箱')
  # message - Textarea
  # widget=forms.Textarea,表示将当前属性变为多行文本域
  message = forms.CharField(label='内容',widget=forms.Textarea)
  # topic - Select
  topic = forms.ChoiceField(label='级别',choices=TOPIC_CHOICE)
  # isSaved - checkbox
  isSaved = forms.BooleanField(label='是否保存')           

    在模板中解析form对象:

        需要自定义form表单

        在表单中需要自定义按钮

        处理方法:

            在视图中创建form对象并发送到模板中

def form_views(request):
  if request.method == 'GET':
    form = RemarkForm()
    return render(request,'04-form.html',locals())           

            手动解析:

                在模板中循环解析

                {% for field in form %}

                    {{field}} 表示的就是控件

                    {{ field.label }} 表示的就是label的值

                {% endfor %}

            自动解析:

                {{ form.as_p }}

                将form中的每个属性使用p标记包裹起来再显示的

                {{ form.as_ul }}

                将form对象中的每个属性使用li标记包裹起来 在显示在网页上

                必须手动提供ol或ul标签

                {{ form.as_table }}

                将form对象的每个属性使用tr标记包裹起来 在显示在网页上

{% csrf_token %}
    {% comment '手动解析' %}
    {% for field in form %}
      <p>
        {{ field.label }}:{{ field }}
      </p>
    {% endfor %}
    {% endcomment %}
    <ul>
      {{ form.as_ul }}
    </ul>           

    在视图中 通过form.Form自动获取表单数据

        1.通过forms.Form的构造器来接受post数据

          form = xxxForm(request.POST)

        2.必须使用form通过验证之后 在取值

          form.is_valid()

          返回值为True表示数据已通过所有验证 允许取值

          返回False提交数据存在未通过验证的 无法取值

        3.通过 form.cleaned_data 来接受提交来的数据

# 通过RemarkForm自动接收数据
    # 1.将request.POST数据传递给RemarkForm构造器
    form = RemarkForm(request.POST)
    # 2.验证form对象
    if form.is_valid():
      # 3.通过验证后获取具体的数据
      cd = form.cleaned_data
      subject = cd['subject']
      email = cd['email']
      isSaved = cd['isSaved']
      message = cd['message']
      topic = cd['topic']
      print(subject,email,isSaved,message,topic)
    return HttpResponse('Post OK')